Oracle 带有Connect by的正则表达式

Oracle 带有Connect by的正则表达式,oracle,Oracle,我有一个疑问: select regexp_substr('1,2,3,4,5','[^,]+',1,level) from test1 connect by instr('1,2,3,4,5',',',1,level-1)>0; 请帮助我理解此查询,尤其是level和connect by以及level-1的使用。level和connect by用于生成序列,请参见以下简单示例: select level from dual connect by level < 10; LE

我有一个疑问:

select regexp_substr('1,2,3,4,5','[^,]+',1,level) 
from test1 
connect by instr('1,2,3,4,5',',',1,level-1)>0;

请帮助我理解此查询,尤其是level和connect by以及level-1的使用。

level和connect by用于生成序列,请参见以下简单示例:

select level
from dual
connect by level < 10;

LEVEL
=======
1
2
3
4
5
6
7
8
9
0级
表示“运行五次”

因此,您的选择基本上是

select regexp_substr('1,2,3,4,5','[^,]+', 1, 1) from dual union all 
select regexp_substr('1,2,3,4,5','[^,]+', 1, 2) from dual union all 
select regexp_substr('1,2,3,4,5','[^,]+', 1, 3) from dual union all 
select regexp_substr('1,2,3,4,5','[^,]+', 1, 4) from dual union all 
select regexp_substr('1,2,3,4,5','[^,]+', 1, 5) from dual;

@Wernfried的答案非常好,但您应该知道,格式为
'[^,]+'
的正则表达式存在很大的风险,人们通常将其视为如何解析分隔字符串的示例

仅当列表中的所有元素都存在时,此选项才起作用。为了让人大开眼界,请尝试将第二个元素设为NULL:

select regexp_substr('1,,3,4,5', '[^,]+', 1, 3) from dual;

REGEXP_SUBSTR('1,,3,4,5','[^,]+',1,3)
-------------------------------------
4   

1 row selected.
什么<代码>'4'绝对不是该列表的第三个元素!如您所见,未处理空值

请使用此格式的
REGEXP\u SUBSTR
,它不处理空列表元素:

select regexp_substr('1,,3,4,5','(.*?)(,|$)', 1, 3, NULL, 1) from dual;


REGEXP_SUBSTR('1,,3,4,5','(.*?)(,|$)',1,3,NULL,1)
-------------------------------------------------
3              

1 row selected.
正则表达式定义了两个组,一组可选的字符,后跟逗号或行尾。REGEXP_SUBSTR的参数
假设返回此匹配的第三个实例的第一组。

根据我的要求,我使用
从双连接逐层选择TRIM(RTRIM(REGEXP_SUBSTR('1,3,4,5'| |',',',','.'| |',',1,LEVEL),','))
select regexp_substr('1,,3,4,5','(.*?)(,|$)', 1, 3, NULL, 1) from dual;


REGEXP_SUBSTR('1,,3,4,5','(.*?)(,|$)',1,3,NULL,1)
-------------------------------------------------
3              

1 row selected.