Sql 正则表达式substr中的connect by子句

Sql 正则表达式substr中的connect by子句,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我无法理解这句话——甚至在谷歌搜索之后也无法理解 pv_编号列表:='23,34,45,56'; 选择不同的REGEXP\u SUBSTR(pv\u no\u列表, '[^,]+', 1. 级别) 无清单 来自双重 通过REGEXP\u SUBSTR(pv\u no\u列表)连接, '[^,]+', 1. 级别)不为空 连接方式与regex\u substr无关: 第一个是执行分层查询,请参见 第二种方法是使用正则表达式获取子字符串 此查询“滥用”了connectby功能,在dual上的查

我无法理解这句话——甚至在谷歌搜索之后也无法理解


pv_编号列表:='23,34,45,56';
选择不同的REGEXP\u SUBSTR(pv\u no\u列表,
'[^,]+',
1.
级别)
无清单
来自双重
通过REGEXP\u SUBSTR(pv\u no\u列表)连接,
'[^,]+',
1.
级别)不为空


连接方式与
regex\u substr
无关:

  • 第一个是执行分层查询,请参见

  • 第二种方法是使用正则表达式获取子字符串

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

然后,在应用正则表达式时,将
级别
传递到
regex_substr
以获得第n个值。

连接的
的“滥用”(正如科林·哈特所说)在这里有一个很好的用途:
通过使用
REGEXP\u SUBSTR
您只能提取4个匹配项(23,34,45,56)中的一个:regex
[^,]+
匹配字符串中不包含逗号的任何字符序列

如果您要尝试跑步:

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

如果你想尝试跑步:

SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+') as "token" 
FROM   DUAL
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
,依此类推

使用由
连接的递归
级别
确保您将收到所有相关结果(但不一定是按原始顺序!):

将返回:

TOKEN
23
34
45
56
它不仅包含所有4个结果,而且在resultset中将其拆分为单独的行

如果你喜欢它,它可能会让你对这个主题有一个更清晰的认识

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
@阿尔法辛:按1点,这对我来说是个错误。“错失权利”
另外,如果我跳过这个步骤,那么当我调用oracle过程时,它会给出错误“ORA-22950:无法在没有映射或排序方法的情况下排序对象”

次要细节,其中说“这次我们将得到43个”,实际上是这样的34@EduCastrillon谢谢,这是一个输入错误-序列中没有43个;)哪种情况更适合级别?A.通过REGEXP_SUBSTR连接('23,34,45,56','[^,]+',1,LEVEL)不为NULL或b。REGEXP_COUNT('23,34,45,56',',')@Nir Alfasi如果我想用逗号分隔符在一行中显示如何?@user2102665现在这是一个不同的问题,我认为应该这样做,但我还没有尝试过。