对于此示例,以下查询如何工作?
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个逗号分隔的元素?
答案 0 :(得分:1)
第一部分简单地将字符串分组为4组并返回每组。通过添加连接,OP表示我希望每个集都返回,因为它自己的行限制返回的行数等于原始数据集。
打破它:
现在通过添加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中所示的顺序返回行。在图中,孩子出现在父母的下方。有关分层树的解释,
长期和短暂地玩它,你会学到很多东西。