19

我无法理解这句话 - 即使在谷歌搜索之后

 
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

4

3 回答 3

28

“滥用”(正如 Colin 't Hart 所说)在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,现在我们还设置了两个附加参数:从位置 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 个结果,而且还在结果集中将其分成单独的行!

如果你会摆弄它 - 它可能会让你更清楚地了解这个主题。

于 2013-10-05T08:05:22.800 回答
6

connect by无关regex_substr

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

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

于 2013-10-05T07:54:11.500 回答
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 方法就无法订购对象”

于 2020-03-02T06:09:19.107 回答