ORACLE逗号分割的字符串转多行(转载)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了ORACLE逗号分割的字符串转多行(转载),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2379字,纯文字阅读大概需要4分钟。
内容图文
![ORACLE逗号分割的字符串转多行(转载)](/upload/InfoBanner/zyjiaocheng/866/73936651bf434dc5a9267e8bf2c8e51e.jpg)
分割单行数据
我们需要使用REGEXP_SUBSTR
和REGEXP_COUNT
两个ORACLE函数
function REGEXP_SUBSTR(string, pattern, position, occurrence, modifier)
string
:需要进行正则处理的字符串pattern
:进行匹配的正则表达式position
:起始位置,从第几个字符开始正则表达式匹配(默认为1)occurrence
:标识第几个匹配组,默认为1modifier
:模式(‘i’不区分大小写进行检索;‘c’区分大小写进行检索。默认为’c’)
function REGEXP_COUNT ( string, pattern [, position [, match_param]])
返回pattern 在string串中出现的次数。如果未找到匹配,则函数返回0。position 变量告诉Oracle 在源串的什么位置开始搜索。在开始位置之后每出现一次模式,都会使计数结果增加1。
SELECT REGEXP_SUBSTR('B00053,D00058,D00094', '[^,]+', 1, LEVEL) VALUE
FROM DUAL
CONNECT BY LEVEL <= REGEXP_COUNT('B00053,D00058,D00094', '[^,]+')
- 1
- 2
- 3
分割后结果如下:
分割多行数据
我们有三行初始数据
WITH TEMP AS
(SELECT T.VALUE, T.COUNTS, T.EXE_ID
FROM SC_MONIT_EXERESULT T
INNER JOIN SYS_TASK_EXECUTE A
ON T.EXE_ID = A.EXEC_ID
WHERE FIELD_CODE = 'fundList'
AND A.BUSIDATE = '20180604'
AND VALUE = 'B00053,D00058,D00094')
SELECT REGEXP_SUBSTR(VALUE, '[^,]+', 1, LEVEL) VALUE,
COUNTS,
EXE_ID
FROM TEMP
CONNECT BY LEVEL <= REGEXP_COUNT(VALUE, '[^,]+')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
分割后数据变成了39行而不是9行!
问题出在使用connect by时,没有类似 id=prior pid的条件,而是 connect by rownum<xxx 或 connect by level<xxx 时,每一条记录都会作为自己或者其他记录的子节点,也就说,每一条记录的子节点就是表上所有的记录。而树的层数就是rownum(或是level)值。
假设表中有N条记录,则记F(N,l)为select id,level from t connect by level<l 的结果集数目。那么:
F ( N , 1 ) = N F(N,1)=NF(N,1)=N
F ( N , l ) = F ( N , l ? 1 ) ? N + N F(N,l) = F(N,l-1)*N+NF(N,l)=F(N,l?1)?N+N
l e v e l < = 3 level<=3level<=3 时,递归查询到的树状结构:
参考文章:深入理解connect by level
我们需要给树加上父子关系,用rownum
作为PK列
WITH TEMP AS
(SELECT T.VALUE, T.COUNTS, T.EXE_ID, ROWNUM ROWNUM1
FROM SC_MONIT_EXERESULT T
INNER JOIN SYS_TASK_EXECUTE A
ON T.EXE_ID = A.EXEC_ID
WHERE FIELD_CODE = 'fundList'
AND A.BUSIDATE = '20180604'
AND VALUE = 'B00053,D00058,D00094')
SELECT 'fundCode' FIELD_CODE,
REGEXP_SUBSTR(VALUE, '[^,]+', 1, LEVEL) VALUE,
COUNTS,
EXE_ID
FROM TEMP
CONNECT BY PRIOR ROWNUM1 = ROWNUM1
AND LEVEL <= REGEXP_COUNT(VALUE, '[^,]+')
AND PRIOR DBMS_RANDOM.VALUE() IS NOT NULL
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
PRIOR DBMS_RANDOM.VALUE() IS NOT NULL
告诉ORACLE每次循环是不一样的,不然会报connect by死循环
最后得到的结果:
内容总结
以上是互联网集市为您收集整理的ORACLE逗号分割的字符串转多行(转载)全部内容,希望文章能够帮你解决ORACLE逗号分割的字符串转多行(转载)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。