Non saprei di una funzione che lo fa fuori dagli schemi in PostgreSQL.
A CTE ricorsivo
sarebbe l'elemento chiave per una soluzione piuttosto elegante (disponibile in PostgreSQL 8.4 o successivo).
Sto assumendo una tabella filter
per contenere le stringhe del filtro:
CREATE TABLE filter (f_id int, string text);
E una tabella tbl
per cercare la corrispondenza più lunga:
CREATE TABLE tbl(t_id int, col text);
Interrogazione
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;
Dettaglio spiegazione di come funziona la SELECT finale in questa risposta correlata.
Demo funzionante su sqlfiddle.
Non hai definito quale corrispondenza scegliere da un insieme di corrispondenze ugualmente lunghe. Scelgo un vincitore arbitrario dai pareggi.
PostgreSQL 9.1 ha introdotto CTE che modificano i dati , quindi puoi usarlo in un UPDATE
dichiarazione direttamente.