2016-07-06 13 views
0

HIには、次のサンプル文字列があります。OracleのREGEXP_INSTRに基づいて文字列から複数の値を抽出

'クレーム番号:299765Member:JOHNSON、XYZサービスライン番号1つの
アクションコード0応答指令1641800532アドバイスライン2サービスライン
ナンバー2アクションコード0応答指令400プロシージャのコード
4805587'

私は、レスポンス・ディレクティブ・ストリングの後に値を抽出する必要があります。今、私は上記のクエリに基づいて1つの結果だけでたのです

WITH TEST AS(
SELECT 'Claim Number: 299765Member: JOHNSON,XYZ Service Line Number 1     
Action Code 0 Response Directive 1641800532 Advice Line 2 Service Line   
Number 2 Action Code 0 Response Directive 400 Procedure Code 
4805587' 
AS NOTE_TEXT FROM DUAL 
) 
SELECT regexp_substr(NOTE_TEXT,'response directive+\s+(\w+)',1,1,'i',1) as  
NUM_VAL 
FROM TEST; 

私は

NUM_VAL

設定し

NUM_VAL

期待される結果を書か

親切に複数発生した場合に役立ちます。ありがとうございます

+0

「FROM dual;」を変更しました。 「FROM TEST;」にあなたのコードの最後の行に(外側のクエリは二重から選択しません)、あなたの問題とは関係がないのでsqldeveloperタグを削除しました。質問:正規表現の 'ディレクティブ'の最後になぜ+があるのですか?これは単に、 'directive'という単語の末尾に' e'という文字が1回以上現れるようにします。あなたがそれを意味していない場合は、あなた自身であなたの投稿を編集し、削除することができます。あなたは尋ねることなくそれをしたくなかった。 – mathguy

答えて

0

簡単な方法が2つあります。

A)、このアプローチで

をサポートする入力データは、50回言う複製し、そして第2の発生のために、第1の発生のために第2の複製を1複製を検索することができるオカレンスの最大数を決定

入力データに存在しないオカレンスはnullとなりますので、WHERE節でそれらをフィルタリングする必要があります。このバージョンでは、発生の任意の数をサポートし、あなただけにデータを50回複製されていないので、パフォーマンスが向上しなければならない

WITH TEST AS(
SELECT 'Claim Number: 299765Member: JOHNSON,XYZ Service Line Number 1     
Action Code 0 Response Directive 1641800532 Advice Line 2 Service Line   
Number 2 Action Code 0 Response Directive 400 Procedure Code 
4805587' 
AS NOTE_TEXT FROM DUAL 
), 
occurrences AS (SELECT rownum occurrence# FROM dual connect by -- Max 50 occurrences supported 
rownum <= 50) 
SELECT regexp_substr(NOTE_TEXT,'response directive+\s+(\w+)',1,occurrences.occurrence#,'i',1) as  
NUM_VAL 
FROM test cross join occurrences 
WHERE regexp_substr(NOTE_TEXT,'response directive+\s+(\w+)',1,occurrences.occurrence#,'i',1) IS NOT NULL; 

B)のみ、後のOracle 12cに働くか(LATERALインライン・ビューを使用します) 1つか2つの出現を見つける。残念ながら、11gでは動作しません。私は完全性のためだけにそれを含めています。標準connect by levelクエリを使用して

-- 12c version 
WITH TEST AS(
SELECT 'Claim Number: 299765Member: JOHNSON,XYZ Service Line Number 1     
Action Code 0 Response Directive 1641800532 Advice Line 2 Service Line   
Number 2 Action Code 0 Response Directive 400 Procedure Code 
4805587' 
AS NOTE_TEXT FROM DUAL 
) 
SELECT regexp_substr(NOTE_TEXT,'response directive+\s+(\w+)',1,occurrences.occurrence#,'i',1) as  
NUM_VAL 
FROM test cross join lateral (SELECT rownum occurrence# FROM dual connect by -- Max 50 occurrences supported 
rownum <= regexp_count(note_text, 'response directive+\s+(\w+)',1,'i')) occurrences 
; 

0

with 
    test (note_text) as (
     select 'Claim Number: 299765Member: JOHNSON,XYZ Service Line Number 1 
       Action Code 0 Response Directive 1641800532 Advice Line 2 Service Line 
       Number 2 Action Code 0 Response Directive 400 Procedure Code 
       4805587' 
     from dual 
    ) 
select level as lvl, 
     regexp_substr(note_text,'response directive (\d+)', 1, level, 'i', 1) as num_val 
from test 
connect by level <= regexp_count(note_text, 'response directive \d+', 1, 'i') 
order by lvl; 

出力

LVL NUM_VAL 
----- ---------- 
    1 1641800532 
    2 400 

2 rows selected. 

これが唯一の "レスポンスディレクティブを" 次の番号をキャッチします。あなたが実際にそれを意味するならば、あなたは(\d+の代わりに)に戻るかもしれません。また、「応答可能な指令」の後に正確に1つのスペースを使用することができます - あなたが好きな場合は\s+に戻ることができます。

+0

これは質問に答えますが、 'test'には1つの行しかないと仮定しています。 –

関連する問題