sql >> Base de Datos >  >> RDS >> PostgreSQL

Coincidencia de prefijo más largo

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.