No sabría de una función que hiciera esto en PostgreSQL.
A CTE recursivo
sería el elemento clave para una solución bastante elegante (disponible en PostgreSQL 8.4 o posterior).
Estoy asumiendo una tabla filter
para contener las cadenas de filtro:
CREATE TABLE filter (f_id int, string text);
Y una tabla tbl
para buscar la coincidencia más larga:
CREATE TABLE tbl(t_id int, col text);
Consulta
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;
Detallado explicación de cómo funciona el SELECT final en esta respuesta relacionada.
Demostración de trabajo en sqlfiddle.
No definió qué coincidencia elegir de un conjunto de coincidencias igualmente largas. Elijo un ganador arbitrario de los empates.
PostgreSQL 9.1 introdujo CTE de modificación de datos , por lo que puede usar esto en un UPDATE
declaración directamente.