sql >> データベース >  >> RDS >> PostgreSQL

最長プレフィックス一致

    PostgreSQLでこれをすぐに実行できる関数を知りません。
    再帰CTE かなり洗練されたソリューション(PostgreSQL 8.4以降で利用可能)の重要な要素になります。

    テーブルfilterを想定しています フィルタ文字列を保持するには:

    CREATE TABLE filter (f_id int, string text);
    

    そしてテーブルtbl 最長の一致を検索するには:

    CREATE TABLE tbl(t_id int, col text);
    

    クエリ

    WITH RECURSIVE
         f AS (SELECT f_id, string, length(string) AS flen FROM filter)
        ,t AS (SELECT t_id, col, length(col) AS tlen FROM tbl)
        ,x AS (
        SELECT t.t_id, f.f_id, t.col, f.string
              ,2 AS match, LEAST(flen, tlen) AS len
        FROM   t
        JOIN   f ON left(t.col, 1) = left(f.string, 1)
    
        UNION ALL
        SELECT t_id, f_id, col, string, match + 1, len
        FROM   x
        WHERE  left(col, match) = left(string, match)
        AND    match <= len
        )
    SELECT DISTINCT
           f_id
          ,string
          ,first_value(col) OVER w AS col
          ,first_value(t_id) OVER w AS t_id
          ,(first_value(match) OVER w -1) AS longest_match
    FROM   x
    WINDOW w AS (PARTITION BY f_id ORDER BY match DESC)
    ORDER  BY 2,1,3,4;
    

    詳細この関連する回答で最終的なSELECTがどのように機能するかを説明します。
    sqlfiddleでの作業デモ。

    同じ長さの一致のセットからどの一致を選択するかを定義していません。ネクタイから任意の勝者を1人選びます。

    PostgreSQL 9.1では、CTEを変更するデータ> 、したがって、これをUPDATEで使用できます 直接声明。




    1. ADO.NETのOracleSQLステートメントを分割する方法

    2. 重複する日付範囲MySQL

    3. colPosをtypo3拡張フラックス9.0.1で更新します

    4. MySQLはPHPで接続します