regex_substr中的connect by子句

问题描述 投票:17回答:3

我听不懂这句话-在谷歌搜索后不是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

sql oracle oracle10g
3个回答
22
投票

connected by的“滥用”(如Colin't Hart所说的)在这里有很好的用途:通过使用REGEXP_SUBSTR,您只能提取4个匹配项(23、34、45、56)之一:regex [^,]+匹配字符串中不包含逗号的任何字符序列。

如果您尝试运行:

SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+') as "token" 
FROM   DUAL

您将获得23

并且,如果您尝试运行:

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

您也将获得23,因为现在我们还设置了[[two additional parameters:从位置1开始查找(这是默认值),然后返回第一个出现的位置。

现在开始运行:

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

这一次我们将获得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

将返回:

TOKEN 23 34 45 56

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

如果您愿意

fiddle,可以使您对主题有更清晰的了解。


5
投票
[connect byregex_substr无关:

此查询“滥用” connect by功能以在对dual的查询中生成行。只要传递给connect by的表达式为true,它将生成一个新行并增加伪列LEVEL的值。

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


0
投票
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
@@ alfasin:按1排序,这对我来说引发错误。 “缺少正确的寄生”另外,如果我跳过此步骤,那么当我调用oracle过程时,它将给出错误“ ORA-22950:如果没有MAP或ORDER方法,则无法对对象进行排序”
© www.soinside.com 2019 - 2024. All rights reserved.