Bạn có thể làm điều đó bằng cách sử dụng mệnh đề bao thanh toán truy vấn phụ đệ quy và các hàm chuỗi đơn giản (thay vì biểu thức chính quy chậm).
(Lưu ý:điều này cũng không có vấn đề với các truy vấn phân cấp khi có nhiều hàng đầu vào của nó tạo ra nhiều hàng đầu ra hơn theo cấp số nhân ở mỗi độ sâu vì nó không thể tương quan từng hàng với mẹ của nó vì vậy nó sẽ tương quan với tất cả các hàng tại mức phân cấp trước.)
Thiết lập Oracle :
CREATE TABLE some_table( some_id, value ) AS
SELECT 8, 'A1,A2,A3;A4,A5,A6' FROM DUAL UNION ALL
SELECT 8, 'B1,B2,B3;B4,B5,B6' FROM DUAL UNION ALL
SELECT 8, 'C1,C2,C3;C4,C5,C6' FROM DUAL;
Truy vấn :
WITH line_start_end ( some_id, value, startidx, endidx ) AS (
SELECT some_id,
value,
1,
INSTR( value, ';', 1 )
FROM some_table
WHERE some_id = 8
UNION ALL
SELECT some_id,
value,
endidx + 1,
INSTR( value, ';', endidx + 1 )
FROM line_start_end
WHERE endidx > 0
)
SELECT some_id,
CASE
WHEN endidx = 0
THEN SUBSTR( value, startidx )
ELSE SUBSTR( value, startidx, endidx - startidx )
END AS value
FROM line_start_end;
Đầu ra :
db <> fiddle tại đây