我听不懂这句话-在谷歌搜索后不是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
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,可以使您对主题有更清晰的了解。
connect by
与regex_substr
无关:此查询“滥用” connect by
功能以在对dual
的查询中生成行。只要传递给connect by
的表达式为true,它将生成一个新行并增加伪列LEVEL
的值。
然后,将LEVEL
传递给regex_substr
以在应用正则表达式时获取第n个值。
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方法,则无法对对象进行排序”