你可以改變在模式中分隔符:
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的原始查詢處理了這個問題,因此我的答案中的第一個查詢也做到了 - 儘管它仍然需要修剪空白。我想知道爲什麼這些模式在原始查詢中不一樣,這可能是爲什麼。你的模式擺脫了OP版本中的'rtrim()',這使得生活更簡單。 –