2017-08-29 97 views
0

我有一個字符串,如mystr = 'value1~|~value2~|~ ... valuen"。我需要它作爲一個列的行分離是這樣的:Regexp_substr查找字符串與一組字符不匹配

value1 
value2 
... 
valuen 

我想這

select regexp_substr(mystr, '[^(~\|~)]', 1 , lvl) from dual, (select level as lvl from dual connect by level <= 5); 

的問題是,~|~不隨地視爲一個組,如果我添加到〜它被分開的字符串;也()被視爲分隔符。

任何幫助,高度讚賞!謝謝! 〜|〜

+0

存儲這樣的值不是一個好主意。閱讀關於規範化 – Jens

+0

值不會像這樣存儲。這只是一個簡單的例子。 –

回答

0

快速和骯髒的解決方案:

with t as (
select rtrim(regexp_substr('value1~|~value2~|~value3~|~value4', '(.+?)($|~\|~)', 1,level,''),'~|~')value from dual connect by level<10 
) select * from t where value is not null; 
+0

這個工程!非常感謝你! –

0

[]表示一個字符匹配和[^]表示一個字符不匹配任何包含的字符。

所以[^(~\|~)]將匹配任何一個字符不是(~\|~(再次)或)

你需要的是由您的分離終止的比賽:

SELECT REGEXP_SUBSTR(
     mystr, 
     '(.*?)(~\|~)', 
     1, 
     LEVEL, 
     NULL, 
     1 
     ) 
FROM DUAL 
CONNECT BY LEVEL < REGEXP_COUNT(mystr, '(.*?)(~\|~)'); 

(或者,如果你不能擁有零寬度匹配,你可以使用CONNECT BY子句中的正則表達式'(.+?)(~\|~)'<=。 )

0

這將解析分隔列表,正則表達式的格式將處理NULL列表元素,如果它們出現,如示例中所示。

SQL> with tbl(str) as (
     select 'value1~|~value2~|~~|~value4' from dual 
    ) 
    select regexp_substr(str, '(.*?)(~\|~|$)', 1, level, NULL, 1) parsed 
    from tbl 
    connect by level <= regexp_count(str, '~\|~')+1; 

PARSED 
-------------------------------- 
value1 
value2 

value4 

SQL>