PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Най-дългото съвпадение на префикса

Не знам за функция, която да прави това веднага в PostgreSQL.
A рекурсивен CTE ще бъде ключовият елемент за доста елегантно решение (достъпно в PostgreSQL 8.4 или по-нова).

Предполагам filter на таблица за задържане на филтърните низове:

CREATE TABLE filter (f_id int, string text);

И таблица tbl за търсене на най-дългото съвпадение:

CREATE TABLE tbl(t_id int, col text);

Запитване

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;

Подробно обяснение как работи крайният SELECT в този свързан отговор.
Работеща демонстрация на sqlfiddle.

Не сте определили кое съвпадение да изберете от набор от еднакво дълги съвпадения. Избирам един произволен победител от равенства.

PostgreSQL 9.1 въведе CTE, модифициращи данни , така че можете да използвате това в UPDATE изявление директно.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres SQL за запитване на масив text[] в конкретен елемент

  2. Определяне на радиуса или диаметъра на минимална ограничаваща окръжност

  3. Мониторинг и одит на производителността PostgreSQL - Топ ресурси

  4. Посочени са множество стойности по подразбиране за идентификатор на колона на таблицата

  5. Python psycopg2 не се вмъква в таблицата на postgresql