sql >> Database >  >> RDS >> PostgreSQL

Langste voorvoegselovereenkomst

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.




  1. Maak zelf geweldige lijsten, of GitHub als notebook

  2. Algoritme om SQL-injectie op MSSQL Server te vermijden vanuit C#-code?

  3. mysql update-query met inner join

  4. Hoe JSON uit de Doobie Scala PostgreSQL-database te lezen met Circe?