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 に感謝します)。