Postgresql
比較 PostgreSQL 字元串中出現的字元
我有一些這樣的數據:
我想在以下條件下比較兩列中的字元串值:如果它們共享至少 2 個字元,它們是相似的(分配一些值,比如 1)。否則,它們不相似。
所以在這個例子中,PPS 和 PSP 是相似的。
如何實現這種子字元串比較?
我知道一種方法是提取子字元串並手動比較它們,但感覺很笨拙,我不知道可能出現的最大字元數。
它們很相似……如果它們共享至少 2 個字元。
不幸的是,字元串或數組沒有內置的“相交”運算符或函式。您可以滾動自己的函式來計算重疊字元:
CREATE FUNCTION f_count_overlapping_char(text, text) RETURNS int LANGUAGE sql PARALLEL SAFE IMMUTABLE STRICT AS $func$ SELECT count(*)::int FROM ( SELECT unnest(string_to_array($1, NULL)) INTERSECT ALL SELECT unnest(string_to_array($2, NULL)) ) sub; $func$;
INTERSECT ALL
包括重複的匹配字元。要折疊重複項,請使用 justINTERSECT
代替。那麼您的查詢可以是:
SELECT *, f_count_overlapping_char(t1.metaphone, t2.metaphone) AS overlap FROM tbl t1 JOIN tbl t2 ON t1.id < t2.id AND f_count_overlapping_char(t1.metaphone, t2.metaphone) >= 2;
db<>在這裡擺弄
但它很昂貴,並且不能很好地擴展表中的更多行 - O(N²)。根據您的實際目標,有各種更好的選擇——比如附加模組pg_trgm提供的三元組相似性。看: