PostgreSQL
 sql >> डेटाबेस >  >> RDS >> 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;

विस्तृत इस संबंधित उत्तर में अंतिम चयन कैसे काम करता है, इसकी व्याख्या करें।
sqlfiddle पर वर्किंग डेमो।

आपने यह परिभाषित नहीं किया कि समान रूप से लंबे मैचों के सेट में से कौन सा मैच चुनना है। मैं टाई में से एक मनमाना विजेता चुन रहा हूँ।

PostgreSQL 9.1 ने डेटा संशोधित CTEs , ताकि आप इसका उपयोग 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. PostgreSQL में दो तिथियों के बीच परिणाम प्राप्त करना

  2. रेल ActiveRecord गलत पोस्टग्रेज डेटाबेस से जुड़ रहा है

  3. jOOQ में खाली सरणी के लिए jsonArrayAgg को जोड़ता है

  4. PostgreSQL प्रतिकृति सर्वोत्तम अभ्यास - भाग 2

  5. PostgreSQL 13:स्लॉट्स को अपने प्राइमरी को खत्म न करने दें