मुझे पोस्टग्रेएसक्यूएल में बॉक्स से बाहर होने वाले फ़ंक्शन के बारे में पता नहीं होगा।
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;
विस्तृत इस संबंधित उत्तर में अंतिम चयन कैसे काम करता है, इसकी व्याख्या करें।
sqlfiddle पर वर्किंग डेमो।
आपने यह परिभाषित नहीं किया कि समान रूप से लंबे मैचों के सेट में से कौन सा मैच चुनना है। मैं टाई में से एक मनमाना विजेता चुन रहा हूँ।
PostgreSQL 9.1 ने डेटा संशोधित CTEs , ताकि आप इसका उपयोग UPDATE
. में कर सकें सीधे बयान।