Вот решение, которое допускает любое количество частей в каждой входной строке (не обязательно одинаковое в двух столбцах и переменное от одной строки к другой).Два последовательных символа каретки обозначают NULL для этого токена.Я добавил идентификатор (чтобы вы знали, откуда берется каждая выходная строка), и добавил столбец ORD, чтобы показать первый токен против второго против третьего и т. Д.
В запросе я использую предложение LATERAL(доступно начиная с Oracle 12.1), что позволяет нам обрабатывать каждую входную строку изолированно, отдельно от других строк - это делает запрос быстрее и проще.В регулярных выражениях обратите внимание, что символ вставки должен быть экранирован (в противном случае это означает «начало строки»), за исключением в наборах символов (здесь: наборы запрещенных символов), где метасимволы теряют свое особое значение.
НОВАЯ НАСТРОЙКА
drop table a purge;
Create table a (id number, col1 varchar2(20), col2 varchar2(20));
insert into a values (101, 'TN^AN^KA','123^456^987');
insert into a values (102, 'AB^CE^YZZ', '234^000');
insert into a values (103, 'AB', '0230');
commit;
ЗАПРОС И ВЫХОД
select a.id, l.ord, l.token
from a,
lateral (select level as ord,
regexp_substr(col1, '([^^]*)(\^|$)', 1, level, null, 1) ||
regexp_substr(col2, '([^^]*)(\^|$)', 1, level, null, 1)
as token
from dual
connect by level <= 1 + greatest(regexp_count(col1, '\^'),
regexp_count(col2, '\^'))
) l
order by id, ord;
ID ORD TOKEN
----- --- --------
101 1 TN123
101 2 AN456
101 3 KA987
102 1 AB234
102 2 CE000
102 3 YZZ
103 1 AB0230