2017-04-19 248 views
3

我懷疑要使用分隔符分割字符串。如何在Oracle 11g中使用兩個分隔符分割字符串regexp_substr函數

基於第一次分裂,分隔符選擇那些分裂字符串應該分頭基於 - 符

我原來的字符串:UMC12I-1234,CSM3-123,VQ, 預期輸出:

UMC12I 
CSM3 
VQ 

每個值來作爲行值

我試過

WITH fab_sites AS (
    SELECT trim(regexp_substr('UMC12I-1234,CSM3-123,VQ,', '[^,]+', 1, LEVEL)) fab_site 
    FROM dual 
    CONNECT BY LEVEL <= regexp_count('UMC12I-1234,CSM3-123,VQ,', '[^,]+')+1 
) 
SELECT fab_site FROM fab_sites WHERE fab_site IS NOT NULL 

- 基於分裂,分隔符

輸出是:

UMC12I-1234 
CSM3-123 
VQ 

我怎樣才能得到我的預期的輸出? (需要再次拆分 - 分隔符)

回答

1

您可以將-之前與regexp_substr使用

([^,-]+)(-[^,-]+)? 

模式將匹配和捕獲提取「字」爲第1個的一個或多個字符比其他然後將匹配-以及除,-以外的1+個字符的可選序列。

查看regex demo

使用此regex_substr行,而不是你的上述正則表達式:

SELECT trim(regexp_substr('UMC12I-1234,CSM3-123,VQ,', '([^,-]+)(-[^,-]+)?', 1, LEVEL, NULL, 1)) fab_site 

online demo

+0

可能您的第二個鏈接存在問題:**在線演示** –

+0

@ k-five:在蝸牛筆記本電腦上打字通常會導致出現此類「拼寫錯誤」。它應該是http://rextester.com/QBE60576。 –

+0

Hi Wiktor,它的工作,非常感謝你 – Chidam

1

你可以試試這個查詢:

WITH fab_sites AS (
     SELECT TRIM(',' FROM REGEXP_SUBSTR('UMC12I-1234,CSM3-123,VQ,', '(^|,)[^,-]+', 1, LEVEL)) fab_site 
     FROM dual 
    CONNECT BY LEVEL <= REGEXP_COUNT('UMC12I-1234,CSM3-123,VQ,', '(^|,)[^,-]+') 
) 
SELECT fab_site 
    FROM fab_sites; 

我們開始通過匹配任何子串以整個字符串^或逗號,(分隔符)開始。然後我們得到所有既不匹配逗號也不匹配的字符-。一旦我們有了這個子字符串,我們就可以從它中刪除任何剩餘的逗號。

P.S.我認爲CONNECT BY子句中的+1是無關緊要的,而「外部」查詢中的WHERE NOT NULL也是如此。

+0

嗨大衛,它的工作,非常感謝 – Chidam

相關問題