PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

So khớp tiền tố dài nhất

Tôi không biết một hàm thực hiện điều này trong PostgreSQL.
A CTE đệ quy sẽ là yếu tố chính cho một giải pháp khá thanh lịch (có sẵn trong PostgreSQL 8.4 trở lên).

Tôi giả sử một bảng filter để giữ các chuỗi bộ lọc:

CREATE TABLE filter (f_id int, string text);

Và một bảng tbl để được tìm kiếm kết quả phù hợp lâu nhất:

CREATE TABLE tbl(t_id int, col text);

Truy vấn

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;

Chi tiết giải thích cách thức hoạt động của SELECT cuối cùng trong câu trả lời có liên quan này.
Bản demo làm việc trên sqlfiddle.

Bạn đã không xác định đối sánh nào để chọn từ một tập hợp các đối sánh dài như nhau. Tôi đang chọn một người chiến thắng tùy ý từ các mối quan hệ.

PostgreSQL 9.1 đã giới thiệu sửa đổi dữ liệu CTE , vì vậy bạn có thể sử dụng nó trong UPDATE tuyên bố trực tiếp.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cập nhật giữa 2 cơ sở dữ liệu bằng dblink không hoạt động

  2. Làm cách nào để thực hiện tìm kiếm không nhạy trọng âm trong Postgres 8.3.x với DB trong utf-8?

  3. postgres phát hiện các mẫu số 0 lặp lại

  4. Dấu gạch dưới hoặc camelCase trong mã định danh PostgreSQL, khi ngôn ngữ lập trình sử dụng camelCase?

  5. Các Tuyên bố Chuẩn bị Đã Tồn tại