Ik zou geen functie kennen die dit standaard in PostgreSQL doet.
Een recursieve CTE
zou het belangrijkste element zijn voor een nogal elegante oplossing (beschikbaar in PostgreSQL 8.4 of later).
Ik ga uit van een tabel filter
om de filterreeksen vast te houden:
CREATE TABLE filter (f_id int, string text);
En een tabel tbl
om te zoeken naar de langste overeenkomst:
CREATE TABLE tbl(t_id int, col text);
Zoekopdracht
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;
Gedetailleerd uitleg hoe de laatste SELECT werkt in dit gerelateerde antwoord.
Werkdemo op sqlfiddle.
Je hebt niet gedefinieerd welke wedstrijd je moest kiezen uit een reeks even lange wedstrijden. Ik kies een willekeurige winnaar uit gelijkspel.
PostgreSQL 9.1 introduceerde gegevens die CTE's wijzigen , dus je kunt dit gebruiken in een UPDATE
verklaring direct.