Saya tidak akan tahu fungsi yang melakukan ini di luar kotak di PostgreSQL.
A CTE rekursif
akan menjadi elemen kunci untuk solusi yang agak elegan (tersedia di PostgreSQL 8.4 atau yang lebih baru).
Saya mengasumsikan tabel filter
untuk menahan string filter:
CREATE TABLE filter (f_id int, string text);
Dan sebuah tabel tbl
untuk mencari kecocokan terlama:
CREATE TABLE tbl(t_id int, col text);
Kueri
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;
Rinci penjelasan bagaimana SELECT terakhir bekerja dalam jawaban terkait ini.
Demo kerja di sqlfiddle.
Anda tidak menentukan kecocokan mana yang harus dipilih dari serangkaian kecocokan yang sama panjangnya. Saya memilih satu pemenang sewenang-wenang dari ikatan.
PostgreSQL 9.1 memperkenalkan CTE pengubah data , sehingga Anda dapat menggunakan ini dalam UPDATE
pernyataan secara langsung.