Вы можете просто изменить разделитель в шаблоне:
select rtrim(regexp_substr (str, '[^,]*(.|$)', 1, level), ',') ASPLIT
from
(select 'str 1, str 2, str 3' as str from dual)
connect by level <= length (regexp_replace (str, '[^,]+')) + 1;
Обратите внимание, что вы делаете не хотите изменить один в группе, (.|$)
; в этом контексте это оператор OR, а не буквальный символ.
Это проще использовать один и тот же шаблон в подстроки, как вы делаете в замене (но обратите внимание, предупреждение Gary_W по поводу этой потери пустых значений с помощью этого шаблона):
select trim(regexp_substr (str, '[^,]+', 1, level)) ASPLIT
from (select 'str 1, str 2, str 3' as str from dual)
connect by level <= length (regexp_replace (str, '[^,]+')) + 1;
ASPLIT
-------------------
str 1
str 2
str 3
Но поскольку у вас есть пробелы после запятых , вам нужно их устранить; Самый простой способ - избавиться от ведущих и конечных пространств с отделкой. Это также показывает изменение на connect by
пределе, но либо работы (опять же, обратите внимание на предупреждение об этой модели):
select trim(regexp_substr (str, '[^,]+', 1, level)) ASPLIT
from (select 'str 1, str 2, str 3' as str from dual)
connect by regexp_substr (str, '[^,]+', 1, level) is not null;
ASPLIT
-------------------
str 1
str 2
str 3
Хорошая точка. Первоначальный запрос OP обрабатывает это, поэтому первый запрос в моем ответе тоже - хотя ему все еще нужно обрезать пробелы. Я задавался вопросом, почему шаблоны не были одинаковыми в исходном запросе, и это, вероятно, почему. Ваш шаблон избавляется от 'rtrim()' в версии OP, что делает жизнь проще. –