2016-09-20 4 views
0

が動作していないように、私は、単純なSQLの部分を持っている:期待通りREGEXP_SUBSTRだから

:アイデアは値の存在があるrandomcol列に存在するパイプで区切られた値を取得することです

select 
REGEXP_SUBSTR (randomcol, '[^|]+', 1, 2) 
||'|'||  REGEXP_SUBSTR (randomcol, '[^|]+', 1, 3) 
||'|'||  REGEXP_SUBSTR (randomcol, '[^|]+', 1, 4) 
from table1 where ADDTL_DETAIL_INFO is not null and module_key='01-07-2016 00:00:00/2212/ 1'; 

~custom|HELLO1||HELLO3 

したがって、HELLO1、空白(2番目のパイプと3番目のパイプの間に値がないため)、HELLO3などの値が必要です。

しかし、私は上記のクエリを実行したときには、として返します。

HELLO1|HELLO3| 

と白のスペースがなくなっています。私はこの空白が必要です。だから私はここで間違って何をしていますか?

+0

あなたは間違ったことはしていませんが、Oracleは - 空の文字列をnullと同じように扱うことによってです。遠くの将来に、Oracleは廃止されるか、またはこれを修正します(いずれか早い方が先になる)。 – mathguy

答えて

1

形式の正規表現'[^|]+'はNULLリスト要素では機能しませんので、避けてください! Split comma separated values to columns in Oracle

利用代わりにこのフォーム:詳細はこの記事を参照してくださいコンマまたはで終わる文字のセットの第5回発生した「第1回を取得思い出しグループとして読み取ることができ

select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual; 

線の終わり "と呼ぶ。

したがって、4番目の要素では、要素3のNULLを保持するために使用します(最初の区切り文字の後ろの文字から最後までの文字列を取得するのではなく別の要素で構築したい場合)。

... 
REGEXP_SUBSTR (addtl_detail_info, '(.*?)(\||$)', 1, 2) || 
REGEXP_SUBSTR (addtl_detail_info, '(.*?)(\||$)', 1, 3) || 
REGEXP_SUBSTR (addtl_detail_info, '(.*?)(\||$)', 1, 4) 
... 

ご存じの方が簡単かもしれません。

SQL> select REGEXP_replace('~custom|HELLO1||HELLO3', '^.*?\|(.*)', '\1') result 
    from dual; 

RESULT 
-------------- 
HELLO1||HELLO3 

SQL> 

あなたは「覚えて」と文字列は「\ 1」で第1回を思い出しグループを参照して交換したいものを括弧サラウンド:ちょうど最初のパイプの後に、すべてをつかみます。

+0

ありがとうございます。私はこの使用法を知らなかった。提供されたリンクにも感謝します。 – Mistu4u

+0

あなたは "[^ |] +"問題を人々に知らせるために一人の使命を果たしました!ここには完璧な例があります。 –

+1

@ Mistu4u可能な簡単な解決法については、編集をご覧ください。 –

関連する問題