如何解决出现单个逗号时拆分字符串,Oracle 中出现多个逗号时不拆分
--case#1
select '1,2,3,4,5,6' from dual;
--case#2
select q'[1aaaaaa,bbb,bbbb (cccc,ccccc) 20,20-09-30 11:11:11 (dddddddd): below eeeeeee is ddddd of teh dddd. ajhvajshbfjasbhfjkabsdfkjabsfkljbaaksjfka . 569716476@@asdasa asdasdi (asfasfasf) 2020-09-30 22:22:27 (sdfsdfal): As per sdfsdfsdfg sdfm: sds the below is a sdfsdf@@@@3**** sd sd sdd sdffve sdffin with sdf ��� the below is correct. the "sdfd" sds tsd sdfe fsI as sdfL. hsdfe we do not sdffte fsw dsddDs123**** just new sdfsdng ssdfsds.@@sdfsda sdfsdni (sdffdsdUP) 2020-09-23 22:31:54 (sdffsdal): sdil zxct cx Gzxcz zxcc: zxcc/zxI-Jcxz- cx zxccx***zxccc rzxcczxc***. 569zxc476@@zxccxi zxcxzze (zxcczxzxc) 2020-02-28 22:21:26,(zxtezxcxz) 03/28-As per zxcc,zxzxx by cx cxcx zxzz is zxcxzz zxcxz zxcc. zxc zx]'
from dual;
--case#3
Please just copy paste the string present in Case#2 several times so that the overall length increase 4000 characters and try you solution.
这个字符串应该在单个逗号出现时拆分,并且不应该在多次出现逗号时拆分,例如双/三等。
另外,如果有人可以用 12345 之类的字符串替换上面的多个逗号,那么它对我有用。不要替换单个逗号
注意上面的字符串来自一个 CLOB 列,所以需要一个高效的查询,它应该占用更少的 CPU。
o/p:
1
2,2
3
4,4
5,5 -- NOTE: this has multiple commas with space
6
解决方法
从 Oracle 11gR2 开始,您可以使用:
WITH strings (value,end_pos,term) AS (
SELECT value,REGEXP_INSTR(value,'((\d+(,*){2,})*\d+)(,|$)',1,1),REGEXP_SUBSTR(value,NULL,1)
FROM table_name
UNION ALL
SELECT value,1)
FROM strings
WHERE end_pos > 0
)
SELECT term
FROM strings
WHERE end_pos > 0;
对于样本数据:
CREATE TABLE table_name ( value ) AS
select '1,2,3,4,5,6' from dual;
输出:
期限 |
---|
1 |
2,2 |
3 |
4,4 |
5,5 |
6 |
可能适用于早期版本的替代方法是:
SELECT RTRIM(
REGEXP_SUBSTR(
t.value,l.COLUMN_VALUE
),','
) AS term
FROM table_name t
CROSS JOIN
TABLE(
CAST(
MULTISET(
SELECT LEVEL
FROM DUAL
CONNECT BY
REGEXP_INSTR(
t.value,LEVEL
) > 0
)
AS SYS.ODCINUMBERLIST
)
) l
sqlfiddle here
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。