Postgresql

如何在PostgreSQL中用LIKE或〜替換(SIMILAR TO +正則表達式)?

  • March 10, 2020

我有以下 PostgreSQL 函式,它檢查其中是否p_text1包含單詞/片語 p_text2

CREATE OR REPLACE FUNCTION public."Contains"(
p_text1 character varying,
p_text2 character varying)
RETURNS boolean
LANGUAGE 'plpgsql'

COST 100
IMMUTABLE 
AS $BODY$

BEGIN

perform 1 
where   ( p_text1 similar to '((% )|(%-)|(%\())?'||p_text2||'(( %)|(-%)|(\)%))?' ) or 
   ( replace(p_text1,'-',' ') similar to '((% )|(%\())?'||replace(p_text2,'-',' ')||'(( %)|(\)%))?' ) or 
   ( replace(p_text1,'-','') similar to '((% )|(%\())?'||replace(p_text2,'-','')||'(( %)|(\)%))?' );      

return found;

END; 
$BODY$;

p_text2如果它前面/後面有破折號、空格、括號或什麼都沒有,則被視為單詞/片語。

例子:

選擇公共。“包含”(‘數據探勘’,‘探勘’)-> true

select public.“contains”(‘資訊檢索 (ir) 系統’ , ‘ir’) –> true

select public.“contains”(‘語義(資訊檢索)’, ‘語義資訊’) –> false

選擇 public.“Contains”(‘ontology-based queries’ , ‘ontology’) –> true

select public.“contains”(‘ontology-based queries’ , ‘ontology based’) –> true

該函式將像這樣呼叫:

select * from my_table
where public."Contains"( text_column , some_text_variable) = true;

鑑於它my_table包含大約 15,000 行。

我閱讀了許多建議避免使用 SIMILAR TO 並用簡單的 LIKE 替換它來解決性能問題……我只是不知道如何用 LIKE 重寫這樣的查詢,我不知道這是否會產生更好的性能。任何幫助表示讚賞。提前致謝

LIKE 遠不如 SIMILAR TO 靈活。一般來說,從 SIMILAR TO 降級到 LIKE 不會有公式化的方法。根據您的範例,可能需要 34 個(44 + 33 + 3*3)個不同的 ORed 一起 LIKE 來完成此操作。例如,您在 OR 分支中的第一個表達式在開始時將 3 個備選方案加上空可能性(總共 4 個)與最後的另一個 4 配對,因此將擴展為 16。

我閱讀了許多避免使用 SIMILAR TO 並用簡單的 LIKE 替換它以解決性能問題的建議

這個建議只有在有一個簡單的 like 可以完成相同的工作時才適用。但總的來說,調整應該基於證據,而不是謠言。所以首先,你真的有性能問題嗎?

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