Можете да го направите, като използвате клауза за факторизиране на рекурсивна подзаявка и прости функции за низове (вместо бавни регулярни изрази).
(Забележка:това също няма проблемите, които йерархичните заявки правят, когато има множество входни редове, генерирайки експоненциално повече изходни редове на всяка дълбочина, тъй като не може да съпостави всеки ред с неговия родител, така че ще го свърже с всички редове на предишното йерархично ниво.)
Настройка на 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;
Заявка :
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;
Изход :
db<>fiddle тук