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