我无法理解这个陈述 - 在谷歌搜索之后没有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
答案 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 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 ,它可能会让您更清楚地了解该主题。
答案 1 :(得分:5)
connect by
与regex_substr
无关:
第一种是执行分层查询,请参阅http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm
第二种是使用正则表达式获取子字符串。
此查询“滥用”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方法,则无法对对象进行排序”