如何在PostgreSQL中用LIKE或〜替換(SIMILAR TO +正則表達式)?
我有以下 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 可以完成相同的工作時才適用。但總的來說,調整應該基於證據,而不是謠言。所以首先,你真的有性能問題嗎?