PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pertandingan Awalan Terpanjang

Saya tidak akan tahu fungsi yang melakukan ini di luar kotak di PostgreSQL.
A CTE rekursif akan menjadi elemen kunci untuk solusi yang agak elegan (tersedia di PostgreSQL 8.4 atau yang lebih baru).

Saya mengasumsikan tabel filter untuk menahan string filter:

CREATE TABLE filter (f_id int, string text);

Dan sebuah tabel tbl untuk mencari kecocokan terlama:

CREATE TABLE tbl(t_id int, col text);

Kueri

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;

Rinci penjelasan bagaimana SELECT terakhir bekerja dalam jawaban terkait ini.
Demo kerja di sqlfiddle.

Anda tidak menentukan kecocokan mana yang harus dipilih dari serangkaian kecocokan yang sama panjangnya. Saya memilih satu pemenang sewenang-wenang dari ikatan.

PostgreSQL 9.1 memperkenalkan CTE pengubah data , sehingga Anda dapat menggunakan ini dalam UPDATE pernyataan secara langsung.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Alias ​​referensi dalam klausa WHERE

  2. Pengaturan dan Penggunaan pgmemcache

  3. Apakah PLV8 mendukung membuat panggilan http ke server lain?

  4. Bagaimana saya bisa menemukan tabel yang mereferensikan baris tertentu melalui kunci asing?

  5. Bagaimana cara men-debug prosedur tersimpan postgresql?