用正则表达式连接。这个查询如何工作?

时间:2014-06-02 18:44:28

标签: sql oracle recursion split

对于此示例,以下查询如何工作?

select regexp_substr('1,2,3','[^,]+', 1, level) abc 
from dual 
connect by regex
regexp_substr('1,2,3', '[^,]+', 1, level) is not null

查询位于https://stackoverflow.com/a/13716501

另一个问题是这个查询的效率如何,例如3000个逗号分隔的元素?

1 个答案:

答案 0 :(得分:1)

第一部分简单地将字符串分组为4组并返回每组。通过添加连接,OP表示我希望每个集都返回,因为它自己的行限制返回的行数等于原始数据集。

打破它:

  • '1,2,3'是我们正在玩的包含子集的集合。
  • '[^,] +表示忽略集合中的逗号将其用作分隔符。
  • ,1表示从子字符串
  • 中的位置1开始
  • 级别表示返回此编号 如果输入2则从子集中设置它将返回第2组。

现在通过添加connect by,作者将每个集合分成与自己在原始集合中的行匹配的行。

我会查看REGEXP_SUBSTR的工作原理。

EXCERPT - REGEXP_SUBSTR通过让您在字符串中搜索正则表达式模式来扩展SUBSTR函数的功能。它也类似于REGEXP_INSTR,但它不返回子字符串的位置,而是返回子字符串本身。如果您需要匹配字符串的内容但不需要它在源字符串中的位置,则此函数很有用。该函数将字符串作为VARCHAR2或CLOB数据返回到与source_char相同的字符集中。

然后了解connect by如何运作

- EXCERPT -

然后,Oracle使用这些评估中的信息来构建层次结构,使用以下步骤:

Oracle选择层次结构的根行 - 满足START WITH条件的那些行。

Oracle选择每个根行的子行。每个子行必须满足CONNECT BY条件相对于其中一个根行的条件。

Oracle选择连续几代子行。 Oracle首先选择步骤2中返回的行的子项,然后选择这些子项的子项,依此类推。 Oracle总是通过评估关于当前父行的CONNECT BY条件来选择子项。

如果查询包含没有连接的WHERE子句,则Oracle会从层次结构中删除不满足WHERE子句条件的所有行。 Oracle分别为每一行评估此条件,而不是删除不满足条件的行的所有子项。

Oracle按照图9-1中所示的顺序返回行。在图中,孩子出现在父母的下方。有关分层树的解释,

enter image description here

长期和短暂地玩它,你会学到很多东西。