PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Corrispondenza prefisso più lunga

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.