`
ColorPanda
  • 浏览: 62966 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

同字段筛选不同值(sql中字符串拆分)

阅读更多

有这样的一个需求,数据库(Oracle)有一字段值:221Q,332W,234,455R,755,需要将其拆分为:221Q,332W,455R 与 234,755 这样的两组数据,并update到表中的其他两个字段。当时我写了一个函数,函数使用了oralce自带的行转列与列转行的两个函数,代码如下:

 

--Purpose:拆分,并去重
  --Example:f_get_cg('755,769A,755A,020',0)返回755,020
  --         f_get_cg('755,769A,755A,020',1)返回769A,755A
  FUNCTION f_get_cg(p_str IN VARCHAR2, p_flg IN NUMBER) RETURN VARCHAR2 IS
    rsult VARCHAR2(4000);
  
  BEGIN
  
    IF p_flg = 0 THEN
    
      SELECT wmsys.wm_concat(cargo)
        INTO rsult
        FROM (SELECT DISTINCT cargo
                FROM (SELECT REGEXP_SUBSTR(p_str, '[^,]+', 1, rownum) cargo
                        FROM DUAL
                      CONNECT BY ROWNUM <=
                                 LENGTH(p_str) -
                                 LENGTH(REPLACE(p_str, ',', '')) + 1))
       WHERE regexp_like(cargo, '^[0-9]+$');
    ELSE
      SELECT wmsys.wm_concat(cargo)
        INTO rsult
        FROM (SELECT DISTINCT cargo
                FROM (SELECT REGEXP_SUBSTR(p_str, '[^,]+', 1, rownum) cargo
                        FROM DUAL
                      CONNECT BY ROWNUM <=
                                 LENGTH(p_str) -
                                 LENGTH(REPLACE(p_str, ',', '')) + 1))
       WHERE regexp_like(cargo, '^[0-9]+[A-Z]+$');
    END IF;
  
    RETURN(rsult);
  END f_get_cg;

 效率极其缓慢,5分钟才能update完5000笔记录。

 

  后来换一种思路,只使用instr,substr函数去拆分,效率嗖就上来了,相同的5000笔记录,只要不到10秒钟时间:

 FUNCTION f_split(p_list VARCHAR2, p_flg IN NUMBER) RETURN VARCHAR2
  
   IS
    p_sep      VARCHAR2(1) := ',';
    l_idx      PLS_INTEGER;
    v_list     VARCHAR2(4000) := p_list;
    v_tempstr  VARCHAR2(100);
    return_str VARCHAR2(4000);
  BEGIN
    LOOP
      l_idx := instr(v_list, p_sep);
    
      IF l_idx > 0 THEN
        v_tempstr := substr(v_list, 1, l_idx - 1);
        IF p_flg = 0
           AND regexp_like(v_tempstr, '^[0-9]+$')
           AND (return_str IS NULL OR instr(return_str, v_tempstr) = 0) THEN
          return_str := return_str || p_sep || v_tempstr;
        ELSIF p_flg = 1
              AND regexp_like(v_tempstr, '^[0-9]+[A-Z]+$')
              AND (return_str IS NULL OR instr(return_str, v_tempstr) = 0) THEN
          return_str := return_str || p_sep || v_tempstr;
        END IF;
        v_list := substr(v_list, l_idx + length(p_sep));
      ELSE
      
        IF p_flg = 0
           AND regexp_like(v_list, '^[0-9]+$')
           AND (return_str IS NULL OR instr(return_str, v_list) = 0) THEN
          return_str := return_str || p_sep || v_list;
        ELSIF p_flg = 1
              AND regexp_like(v_list, '^[0-9]+[A-Z]+$')
              AND (return_str IS NULL OR instr(return_str, v_list) = 0) THEN
          return_str := return_str || p_sep || v_list;
        END IF;
      
        EXIT;
      
      END IF;
    
    END LOOP;
  
    RETURN substr(return_str, 2);
  
  END f_split;

函数随好,可不能乱用。

 

 

分享到:
评论

相关推荐

    sql2000字符串分割,字符串拆分

    #### 标题解读:“sql2000字符串分割,字符串拆分” 此标题指明了文章的主要内容是关于如何在SQL Server 2000环境中实现字符串的拆分操作。字符串拆分通常是指将一个较长的字符串按照某种规则(如特定字符)分割成...

    Sqlserver长字符串拆分为多行 高效

    自己写了一个function 用于处理拆分时的逻辑运算,性能比网上找的快好几倍, 代码和说明:https://blog.csdn.net/jimyao37/article/details/123522885

    Sql拆分字符串

    #### SQL字符串拆分背景介绍 在实际业务场景中,我们经常会遇到需要将一个包含多个值的字符串拆分成多个独立的数据项的情况。比如,一个字段存储了以逗号分隔的商品ID列表,为了方便后续处理,我们需要将其拆分成...

    SQL字符串拆分函数

    SQL字符串拆分函数,可拆分任何格式的字符串,只需传入待拆分字符串及拆分参数即可

    sqlserver 字符串分割、包含、匹配

    2、按指定符号分割字符串,返回“分割后指定索引的第几个元素”的值,象数组一样方便 3、检查一个元素是否在数组中,返回1或0 4、检查一个元素是否与数组中的相匹配,并返回相匹配的数组的值。参数值为0表示全模糊...

    sqlserver中根据某个字符切割字符串函数

    sqlserver中根据某个字符切割字符串函数,比如根据逗号切割字符串,结果返回的是一个表值函数,这个函数返回结果字段包含Id和Value,Id为序号,Value为切割后的值

    SQL拆分字符串.sql

    创建函数,拆分字符串

    截取用,分割的字符串中的第n个字符串 SQL

    根据给定的信息,本文将详细解释如何在SQL中实现截取用特定字符分割的字符串中的第n个子字符串。此需求通常应用于数据处理与分析场景中,尤其在处理半结构化或非结构化的文本数据时非常有用。 ### 核心知识点解析 ...

    SQLServer逗号分隔的字符串转换成表

    2. 利用 SQL Server 函数进行字符串拆分:可以使用 SQL Server 的字符串函数,例如 CHARINDEX、LEFT、RIGHT、LEN 等函数对字符串进行拆分。 3. 将拆分后的数据写入到临时表中:将拆分后的数据写入到第 1 步中创建的...

    SQL 语句 将一个表中用特殊字符分割的字段转换成多行数据.docx

    在数据库中,经常会遇到将一个字段中的特殊字符分割的字符串转换成多行数据的情况。这是一个常见的需求,但是网上提供的解决方案往往非常复杂,难以理解和实现。为了解决这个问题,我们可以创建一个字符串分割函数,...

    Oracle字段转字符串/多行记录合并/连接/聚合字符串的几种方法

    在Oracle数据库中,有时我们需要将多个字段值转换为单个字符串,或者将多行记录合并成一行,这在数据处理和报告生成时尤其常见。Oracle提供了多种方法来实现这一目标,包括使用内置函数、PL/SQL过程以及一些高级特性...

    plsql分割字符串

    本文将深入探讨如何在PL/SQL中实现字符串的分割,并通过具体代码示例进行解析。 ### PL/SQL分割字符串概述 分割字符串是指将一个较长的字符串按照特定的分隔符或规则拆分为多个较小的部分。在PL/SQL中,这种需求...

    sqlserver2008 拆分字符串

    在SQL Server 2008中,没有内置的函数可以直接处理这种字符串拆分,但可以通过一些技巧实现。下面是一个可能的解决方案: ```sql -- 创建临时表存储原始数据 CREATE TABLE ta ( id INT, id_value VARCHAR(30) ); ...

    SQL字段拆分优化

    今天看到一条用函数处理连接的SQL,是群里某位网友的,SQL语句如下: SELECT SO_Order.fdate , SO_Order.fsn FROM so_order INNER JOIN so_orderitem ON ...–3.so_order表的fid字段是字符串集合, –由1-2个

    字符串分割成数组函数(plsql function)

    将字符串分割成数组: 例如将字符串“7369,7499,7521,7844"分割成 7369 7499 7521 7844 用法:可以将分割结果做为一个数组或者数据库表列来使用 select * from scott.emp where empno in (select column_value from...

    sql2000数据拆分

    - 对于每一行的`id`,`value`字段被拆分为多个新行,每行仅包含原`value`中的一个值。 #### 2. **创建测试表** - **代码**: ```sql IF OBJECT_ID('tb','U') IS NOT NULL DROP TABLE tb GO CREATE TABLE tb ...

    oracle sql 某列的值按照逗号分割显示成多行.sql

    oracle 某列存儲的值是有逗號的字符串,希望通過逗號分隔開來顯示多行。sql,有預期結果,有項目實戰。

    db2字符串分隔,函数,过程的使用

    例如,如果你有一个字段存储了逗号分隔的值(如ID列表),你可以先使用`TOKENIZE()`分隔字符串,然后通过循环处理每个ID,这在处理批量数据时非常有用。 5. 性能优化: 当处理大量字符串数据时,注意优化查询,...

    SQL根据指定分隔符分解字符串实现步骤

    在SQL中,有时我们需要将一个包含多个值的字符串分解为单独的元素,这通常通过指定一个分隔符来完成。MS SQL Server 提供了一种方法来实现这一功能,虽然它没有内置的函数直接处理字符串分解,但我们可以创建自定义...

    SQL Server实现将特定字符串拆分并进行插入操作的方法

    在SQL Server中,有时我们需要处理包含多个值的单一字符串,并将其拆分成单独的记录,然后将这些值插入到数据库表中。这通常涉及到字符串处理、循环以及条件判断等操作。以下是一个具体的示例,演示了如何实现这个...

Global site tag (gtag.js) - Google Analytics