Вы можете использовать cross apply
с иерархической connect by
для достижения этого:
with t (text) as (select ',1,,3,4,5,6,,8,9' from dual union all
select ',1,,2' from dual)
select regexp_substr(text, '[^,]+', 1, lvl) x
from t cross apply (
select level lvl
from dual
connect by level <= regexp_count(t.text, ',') + 1
);
Вышеупомянутое работает для нескольких строк одновременно.
Если у вас есть только один ряд для преобразования, используйте:
with t (text) as (select ',1,,3,4,5,6,,8,9' from dual)
select
regexp_substr(text, '[^,]+', 1, level) x
from t connect by level <= regexp_count(text, ',') + 1;
Если вы хотите, чтобы получить результат в том порядке, как это произошло во входной строке, попробуйте следующее:
with t (text) as (select ',1,,3,4,5,6,,8,9' from dual union all
select ',1,,2' from dual)
select replace(regexp_substr(text, '[^,]*,?', 1, lvl),',') x
from t cross apply (
select level lvl
from dual
connect by level <= regexp_count(t.text, ',') + 1
);
Если ваш разделитель ^|{
, убедитесь, что вы избегаете специальных символов должным образом. Попробуйте это:
with t (text) as (select '^|{1^|{^|{3^|{4^|{5^|{6^|{^|{8^|{9' from dual union all
select '^|{1^|{^|{2' from dual)
select replace(regexp_substr(text, '[^(\^\|\{)]*(\^\|\{)?', 1, lvl),'^|{') x
from t cross apply (
select level lvl
from dual
connect by level <= regexp_count(t.text, '\^\|\{') + 1
);
Только одна строка для преобразования? – GurV
Есть ли известный максимум по числу запятых? –
Какую версию Oracle вы используете? – GurV