1

次のイベント パターン「5065|5373|5373」が最後に発生した後に現れる次の単一イベントを見つける必要があります。私の問題は、パターンが文字列に1回からn回存在する可能性があることです。これは、私が検索しなければならないいくつかのデータの例です。

BOLDのイベントは、私が探しているものです。

5065|5373|5373|5065|5373|5373|5065|5373|5373| 5509 |5329|5321 5065|5373|5373|5065|5373|5373| 5509 |5270|5373|5373|5373|5080|5081|5013|5040|5295|5321 5065|5373|5373| 5295 |5323|5321

どんな助けでも大歓迎です!

4

2 に答える 2

0

新しいストアドプロシージャまたはUDFを作成できない場合は、次の再帰クエリを使用して作成します。

WITH Recurs(id, index, token, source) as (
            SELECT id, LOCATE('5065|5373|5373|', M.PATH_2), '', M.PATH_2
            FROM M
            UNION ALL 
            SELECT id, LOCATE('5065|5373|5373|', source, index + 15), 
            SUBSTR(source, index + 15, 4), source
            FROM Recurs
            WHERE index > 0)
SELECT * 
FROM Recurs
WHERE index = 0

これにより、期待どおりの結果が得られます。

ID  INDEX   TOKEN  SOURCE 
3   0       5295   5065|5373|5373|5295|5323|5321     
2   0       5509   5065|5373|5373|5065|5373|5373|5509|5270|5373|5373|5373|5080|5081|5013|5040|5295|5321
1   0       5509   5065|5373|5373|5065|5373|5373|5065|5373|5373|5509|5329|5321
于 2012-06-13T22:40:28.047 に答える
0

これを行うかなり簡単な方法の 1 つは、再帰的な共通テーブル式 (CTE) を使用することです。

CREATE FUNCTION localutil.locatelastmatch(
       searchparm VARCHAR(4000), inputparm VARCHAR(4000)
)
RETURNS SMALLINT
LANGUAGE SQL
RETURN
WITH rcurs(counter, output ) AS (
    VALUES (0,0)
    UNION ALL
    SELECT counter+1, LOCATE(searchparm,inputparm,counter+1) 
       FROM rcurs
       WHERE counter < LENGTH(inputparm) AND counter < 32767
    )
SELECT MAX(output) FROM rcurs
;

これは、最後に一致したものを見つけるための最も安価な方法ではないかもしれませんが、少なくともその候補です。複雑さをスカラー ユーザー定義関数 (UDF) に埋め込むことで、パターンの最後のインスタンスを検索する必要があるすべてのクエリに SQL 再帰を導入する必要がなくなります。

サンプル文字列に対してどのように機能するかを次に示します。

WITH originput(val) as (VALUES
('5065|5373|5373|5065|5373|5373|5065|5373|5373|5509|5329|5321'),
('5065|5373|5373|5065|5373|5373|5509|5270|5373|5373|5373|5080|5081|5013|5040|5295|5321'),
('5065|5373|5373|5295|5323|5321')
)
SELECT LENGTH(val) AS inputlength, 
    localutil.locatelastmatch( '5065|5373|5373|', val ) AS finaloffset,
    SUBSTR(val, localutil.locatelastmatch( '5065|5373|5373|', val ) 
    + LENGTH( '5065|5373|5373|' ), 4) AS nextitem
FROM originput
;

INPUTLENGTH FINALOFFSET NEXTITEM
----------- ----------- --------
         59          31 5509
         84          16 5509
         29           1 5295
于 2012-06-13T21:53:05.340 に答える