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.