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
ステートメントで直接使用できます。