PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Najdłuższe dopasowanie przedrostka

Nie znam funkcji, która robi to po wyjęciu z pudełka w PostgreSQL.
A rekurencyjne CTE byłby kluczowym elementem dla dość eleganckiego rozwiązania (dostępnego w PostgreSQL 8.4 lub nowszym).

Zakładam, że tabela filter do przechowywania ciągów filtrów:

CREATE TABLE filter (f_id int, string text);

I tabelę tbl szukać najdłuższego dopasowania:

CREATE TABLE tbl(t_id int, col text);

Zapytanie

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;

Szczegółowe wyjaśnienie, jak końcowy SELECT działa w tej powiązanej odpowiedzi.
Praca na sqlfiddle.

Nie zdefiniowałeś, który mecz wybrać z zestawu równie długich meczów. Wybieram jednego arbitralnego zwycięzcę z remisów.

PostgreSQL 9.1 wprowadził CTE modyfikacji danych , więc możesz użyć tego w UPDATE oświadczenie bezpośrednio.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ruby 'pg' klejnot łączący się z niewłaściwą kopią libpq.5.dylib (na OSX)

  2. Jak unpivotować tabelę w PostgreSQL

  3. PostgreSQL:Automatyczne tworzenie kopii zapasowych w systemie Windows

  4. Klucz podstawowy dla wielu kolumn w PostgreSQL?

  5. Postgresql - czy istnieje sposób na wyłączenie wyświetlania instrukcji INSERT podczas wczytywania z pliku?