regex_substr中的connect by子句

kus*_*lvm 17 sql oracle oracle10g

我不能理解这个陈述 - 在谷歌搜索后不是eveN

 
pv_no_list :='23,34,45,56';
SELECT   DISTINCT REGEXP_SUBSTR (pv_no_list,
                                                     '[^,]+',
                                                     1,
                                                     LEVEL)
                                         no_list
                      FROM   DUAL
                CONNECT BY   REGEXP_SUBSTR (pv_no_list,
                                            '[^,]+',
                                            1,
                                            LEVEL) IS NOT NULL

alf*_*sin 22

"滥用"(如Colin't Hart所说)在connected by这里有一个很好的用途:通过使用REGEXP_SUBSTR你只能提取4个匹配中的一个(23,34,45,56):正则表达式[^,]+匹配字符串中的任何字符序列它不包含逗号.

如果您尝试运行:

SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+') as "token" 
FROM   DUAL
Run Code Online (Sandbox Code Playgroud)

你会得到的23.

如果您尝试运行:

SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,1) as "token"
FROM   DUAL
Run Code Online (Sandbox Code Playgroud)

你也将23只得到现在我们还设置了两个额外的参数:开始查看位置1(这是默认值),并返回第一次出现.

现在让我们运行:

SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,2) as "token"
FROM   DUAL
Run Code Online (Sandbox Code Playgroud)

这次我们将得到34(第二次出现)并使用3最后一个参数将返回45,依此类推.

使用递归connected by同时level确保您将收到所有相关结果(不一定按照原始顺序!):

SELECT DISTINCT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) as "token"
FROM   DUAL
CONNECT BY REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) IS NOT NULL
order by 1
Run Code Online (Sandbox Code Playgroud)

将返回:

TOKEN
23
34
45
56
Run Code Online (Sandbox Code Playgroud)

它不仅包含所有4个结果,还将其分解为结果集中的单独行!

如果你搞定它 - 它可能会让你更清楚地看到这个主题.


Col*_*art 5

connect by与...无关regex_substr:

此查询"滥用" connect by在查询中生成行的功能dual.只要传递给的表达式connect by为true,它就会生成一个新行并增加伪列的值LEVEL.

然后LEVEL传递给regex_substr在应用正则表达式时获取第n个值.