`

oracle中通过正则表达式函数处理逗号分隔的字段

阅读更多
  这个题目的确不大好写,其实际含义基于一个场景:

比如在oracle的某张表中,有两个字段

A1          B1
1         A,B,C,D,
2         E,F
   假如现在的需求,是要统计A1中,每条记录拥有多少个数目的B1,比如
A1=1的时候,其B1的字段中有4个以逗号分隔的,所以数目为4,A1=2的,有
E,F共2个,所有数目为2
    而在ORACLE中,如果使用ORACLE本身的函数,其实也是可以做到这个
效果的,核心是把这些逗号分隔的字符,逐一拆出来,变成一行行,上面的例子来说,
就要想办法变成


  A1       B1
  1        A
  1        B
  1        C
  1        D
  2        E
  2        F
 
  读者可能马上想到,这个其实是一对多关联关系的数据库存储方法,也是最常用的,
但有的时候,用A,B,C,D这样的方式也是可以保存一对多关系的,两种之间可以进行转换,
在oracle中有两种方法实现。

1) oracle中的正则表达式的函数REGEXP_SUBSTR
   oracle中的REGEXP_SUBSTR的用法,先介绍下:

5个参数
第一个是输入的字符串
第二个是正则表达式
第三个是标识从第几个字符开始正则表达式匹配。(默认为1)
第四个是标识第几个匹配组。(默认为1)
第五个是是取值范围:
i:大小写不敏感;
c:大小写敏感;
n:点号 . 不匹配换行符号;
m:多行模式;
x:扩展模式,忽略正则表达式中的空白字符。

全部测试数据
SQL> select * from test_reg_substr;
A
-----------------------------------
ABC123XYZ
ABC123XYZ456
<Name>Edward</Name>

检索中间的数字
SQL> SELECT
2    REGEXP_SUBSTR(a,'[0-9]+')
3  FROM
4    test_reg_substr
5  WHERE
6    REGEXP_LIKE(a, '[0-9]+');
REGEXP_SUBSTR(A,'[0-9]+')
---------------------------------
123
123

检索中间的数字(从第一个字母开始匹配,找第2个匹配项目)
SQL> SELECT
2    NVL(REGEXP_SUBSTR(a,'[0-9]+',1, 2), '-') AS a
3  FROM
4    test_reg_substr
5  WHERE
6    REGEXP_LIKE(a, '[0-9]+');
A
------------------------------------------------------
-
456

取得“字符集合”
SQL> SELECT
2    REGEXP_SUBSTR(a, '\w+')
3  FROM
4    test_reg_substr
  5  WHERE
6    REGEXP_LIKE(a, '\w+');
REGEXP_SUBSTR(A,'\W+')
-------------------------------
ABC123XYZ
ABC123XYZ456
Name

取得“字符集合”(从第一个字母开始匹配,找第2个匹配项目)
SQL> SELECT
2    NVL(REGEXP_SUBSTR(a, '\w+',1, 2), '-') AS a
3  FROM
4    test_reg_substr
  5  WHERE
6    REGEXP_LIKE(a, '\w+');
A
---------------------------------------------------
-
-
Edward


  更多的关于这个的介绍,可以看
http://topmanopensource.iteye.com/blog/1198638
这个文的小结,小结的不错。但要注意的是,在10G以上才支持,


方法1) 使用上面的正则,语句为
  
  
SELECT distinct A1, REGEXP_SUBSTR(B1, '[^,]+', 1, LEVEL) AS A2
   FROM TEST
   CONNECT BY LEVEL <= LENGTH(B1)-LENGTH(REPLACE(B1, ','))+1)





方法2)

select a1, substr(b1, 0, instr(b1, ',')) from
test union select a1, substr(b1, instr(b1, ',')+1,length(b1))
from test

方法3
   使用SQL,首先在b1字段后面添加一个逗号,比如
要某条记录中B1的字段内容为'duan,shao,chu,tian'

SELECT L_COUNT,
       SUBSTR('duan,shao,chu,tian' || ',',
              INSTR('duan,shao,chu,tian' || ',',
                    ',',
                    L_COUNT - 1,
                    DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1)) + 1,
              INSTR('duan,shao,chu,tian' || ',',
                    ',',
                    1,
                    DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1) + 1) -
              INSTR('duan,shao,chu,tian' || ',',
                    ',',
                    1,
                    DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1)) - 1) AS RS
  FROM DUAL,
       (SELECT LEVEL L_COUNT
          FROM DUAL
        CONNECT BY LEVEL <
                   LENGTH('duan,shao,chu,tian' || ',') -
                   LENGTH(REPLACE('duan,shao,chu,tian' || ',', ',', '')) + 1);
  其中2,3方法对oracle 9i也是可以使用的
4
7
分享到:
评论

相关推荐

    Oracle字段根据逗号分割查询数据的方法

    在Oracle数据库中,有时我们遇到一个特殊的查询需求,即字段中的值是以逗号分隔的字符串,我们需要根据每个单独的值来查询数据。在这种情况下,简单的`LIKE`查询无法满足需求,因为`LIKE`通常用于匹配模式,而不是...

    oracle将以逗号分隔字符串转多行

    在Oracle数据库中,将逗号分隔的字符串转换为多行是常见的数据处理需求,尤其在需要对每个分隔项进行单独操作时。这个过程通常涉及到字符串处理函数,如`REGEXP_SUBSTR`和`REPLACE`,以及层次查询结构`CONNECT BY`。...

    Oracle 两个逗号分割的字符串,获取交集、差集(sql实现过程解析)

    总结来说,处理逗号分隔的字符串时,Oracle提供了强大的正则表达式功能。`REGEXP_SUBSTR`和`REGEXP_REPLACE`这两个函数可以帮助我们有效地分析和操作这些字符串。通过结合使用`INTERSECT`和`MINUS`操作符,我们可以...

    数据库-oracle-学习之路.docx

    6. **正则表达式函数**: - `REGEXP_LIKE`用于在WHERE子句中进行正则表达式匹配。 - `REGEXP_SUBSTR`从源字符串中提取符合正则表达式的子串。 - `REGEXP_INSTR`找到正则表达式在源字符串中出现的位置。 - `...

    一个oracle根据特定字符截取数据

    这篇博客“一个oracle根据特定字符截取数据”分享了一个实用的方法,适用于那些需要从字符串字段中提取部分信息的情况。通过SQL查询,我们可以高效地完成这项任务。 在Oracle SQL中,有多个内置函数可以帮助我们...

    浅谈Oracle下connect by原理.pdf

    这里利用了Oracle的正则表达式功能,通过`regexp_substr`函数与`CONNECT BY`结合,实现了将字符串按照指定分隔符(这里是逗号)进行分割,并以表的形式展示分割后的每一项。 5. 结论: 通过本文的介绍,我们可以...

    excel批量转换为txt文本文档及数据清洗整理检查小工具

    数据清洗可能通过正则表达式、pandas内置函数或者自定义逻辑来实现。例如,它可能会检查并处理重复行、转换数据类型,以及确保数值字段没有非数字字符等。 在转换过程中,特定分隔符转换是一个关键环节。不同的系统...

    sql高级进阶

    - 根据表中的行创建一个分隔列表:将行数据合并为一个逗号分隔的字符串。 - 提取第n个分隔的子串:使用数据库的字符串分割函数。 - 分解IP地址:将IP地址字符串拆分成单独的数字。 - 将分隔数据转换为多值IN列表...

    Delphi文本和数据库表格记录的转换

    2. **解析文本数据**:根据分隔符,使用`SplitString`函数或者正则表达式对每行文本进行拆分,将字段分离出来。 3. **连接数据库**:使用ADO(ActiveX Data Objects)或BDE(Borland Database Engine)组件,可以...

    R参考资料

    4. **正则表达式搜索**: 通过`apropos("topic")`来查找所有符合正则表达式"topic"的对象名称。 5. **HTML帮助**: `help.start()`可以打开HTML形式的帮助文档,这对于需要更详细信息的用户非常有用。 6. **对象结构**...

    kettle_使用中的一些常见问题.docx

    1. **数据库内置函数处理**: 如果参数值是从数据库中获取的, 大多数数据库都提供了处理 null 值的函数, 如 MySQL 的 ISNULL 函数。 2. **JavaScript 步骤处理**: 如果参数值是从其他步骤中获得的, 可以通过 ...

Global site tag (gtag.js) - Google Analytics