2017-04-19 20 views
3

デリミタを使用して文字列を分割することは疑いがあります。Oracle 11gのregexp_substr関数で2つのデリミタを使用して文字列を分割する方法

に基づいて、第1分割、区切り、それらの分割さ文字列がに基づいて分割する必要があります選択 -

区切りマイ元の文字列: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

2番目のリンクに問題があります:**オンラインデモ** –

+0

@ k-five:カタツムリのラップトップに入力すると、通常このような「タイプミス」が発生します。それはhttp://rextester.com/QBE60576でなければなりません。 –

+0

こんにちは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.私は+1CONNECT BY句が無関係であると思います。外側のクエリのWHERE NOT NULLです。

+0

こんにちはデイヴィッド、働いて、ありがとう – Chidam

関連する問題