CONNECT BY
众所周知,正则表达式是昂贵的函数,因此当性能至关重要时(例如在子句中使用标准函数),您应该尽量减少它们的使用。
使用标准函数 ( INSTR
, SUBSTR
, REPLACE
) 会更有效,但生成的代码将难以阅读/理解/维护。
我忍不住写了一个递归 QTE,它比正则表达式和标准函数都高效得多。此外,递归 QTE 查询可以说有一些优雅。您需要 Oracle 11.2:
WITH rec_sql(row_id, aggregator, lvl, tail) AS (
SELECT row_id,
nvl(substr(aggregator, 1, instr(aggregator, ';') - 1),
aggregator),
1 lvl,
CASE WHEN instr(aggregator, ';') > 0 THEN
substr(aggregator, instr(aggregator, ';') + 1)
END tail
FROM dummy_1 initialization
UNION ALL
SELECT r.row_id,
nvl(substr(tail, 1, instr(tail, ';') - 1), tail),
lvl + 1,
CASE WHEN instr(tail, ';') > 0 THEN
substr(tail, instr(tail, ';') + 1)
END tail
FROM rec_sql r
WHERE r.tail IS NOT NULL
)
SELECT * FROM rec_sql;
您可以在SQLFiddle上看到该解决方案非常高效,并且与@ABCade 的解决方案相当。(感谢 ABCade 的测试用例)。