2017-05-04 6 views
0

CLOBに含まれている複数行のフィールドで2行を照合しようとしています。ここで私が何をしようとしています何の例です:PL SQL内の複数行モード正規表現を使用した複数行にわたる一致

SELECT MULTI_LINE_TXT, 
     REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1$', 1, 'm') AS ID_1_CNT, --Works as expected 
     REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1$^Port3$', 1, 'm') AS PORT_3_ID_1_CNT --Does not work how I am hoping 
    FROM (SELECT 'EVENT TYPE ID: 1' || CHR(10) || 'Port3' || CHR(10) || 'EVENT TYPE ID: 2' || CHR(10) || 'Port3' || CHR(10) || 
       'EVENT TYPE ID: 1' || CHR(10) || 'Port3' || CHR(10) || 'EVENT TYPE ID: 2' || CHR(10) || 'Port3' || CHR(10) || 
       'EVENT TYPE ID: 1' || CHR(10) || 'Port4' || CHR(10) || 'EVENT TYPE ID: 2' || CHR(10) || 'Port4' AS MULTI_LINE_TXT 
      FROM DUAL) 

出力例:

ROW | MULTI_LINE_TXT  | ID_1_CNT | PORT_3_ID_1_CNT 
--------------------------------------------------------------- 
1 | EVENT TYPE ID: 1 | 3   | 0 
    | Port3    |    | 
    | EVENT TYPE ID: 2 |    | 
    | Port3    |    | 
    | EVENT TYPE ID: 1 |    | 
    | Port3    |    | 
    | EVENT TYPE ID: 2 |    | 
    | Port3    |    | 
    | EVENT TYPE ID: 1 |    | 
    | Port4    |    | 
    | EVENT TYPE ID: 2 |    | 
    | Port4    |    | 

私が持っている最初の正規表現:

REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1$', 1, 'm') AS ID_1_CNT 

カウントEVENT TYPE ID: 1の事件のすべて予想通り。私が持っている問題は、次の行も参照しない限り、このイベントがどのポートに対応しているのかわかりません。

私はこのような何かやって次の行参照しようとしました:

REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1$^Port3$', 1, 'm') AS PORT_3_ID_1_CNT 

をしかし、あなたは私の出力例で見ることができるように、それは私が期待していますように動作するようには思えないし、それは常に数を返します0の場合、2のカウントを期待しています。

誰かが私が間違っていることを知っていますか、これを解決しようとする可能性がある別の方法でしょうか?ありがとうございました!

答えて

1

さて、私は愚かだと感じないでください....私はこれを投稿した直後に解決策を見つけました。

代わりにライン$とライン^の始まりの終わりに一致するようにしようと、私はちょうどそれを連結して、直接新しい行を一致:

REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1' || CHR(10) || 'Port3$', 1, 'm') AS PORT_3_ID_1_CNT 

私はこれを行うと、それは2 Iの数を返します。期待していた

関連する問題