regexp_substr中的connect by子句

时间:2013-10-05 07:40:25

标签: 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

3 个答案:

答案 0 :(得分:21)

connected by的“虐待”(如科林特哈特所说)在这里有一个很好的目的: 通过使用REGEXP_SUBSTR,您只能提取4个匹配项中的一个(23,34,45,56):正则表达式[^,]+匹配字符串中不包含逗号的任何字符序列。

如果您尝试跑步:

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 bylevel可确保您收到所有相关结果(不一定按照原始顺序!):

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 ,它可能会让您更清楚地了解该主题。

答案 1 :(得分:5)

connect byregex_substr无关:

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

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

答案 2 :(得分: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方法,则无法对对象进行排序”