Postgresql

比較 PostgreSQL 字元串中出現的字元

  • May 6, 2022

我有一些這樣的數據:

我想在以下條件下比較兩列中的字元串值:如果它們共享至少 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提供的三元組相似性。看:

引用自:https://dba.stackexchange.com/questions/311738