単語/文が文字列に含まれているかどうかを確認する必要があるpl/pgsqlスクリプトがあり、単語の境界を処理し、大文字と小文字を区別する必要があります。
例:
- 文字列: "my label xx zz yy"、パターン: "my label"、MATCH
- 文字列: "xx my label zz"、パターン: "my label"、MATCH
- 文字列: "my labelxx zz"、パターン: "my label"、NO MATCH
したがって、明らかな解決策は、次のように正規表現を使用することです。
select _label ~* (E'\\y' || _pattern || E'\\y') into _match;
それは動作しますが、単純なものと比較して遅いです
select _label ilike '%' || _pattern || '%' into _match;
これは、私のスクリプトが A LOT を呼び出す関数にラップされ (数千万の場合、私は多くの再帰を行います)、この要件により、全体の実行時間は 2 倍になりました。
今私の質問は、これを実装するより速い方法はありますか?
ありがとう。
編集:これを使用して終了しました:
if _label ilike '%' || _pattern || '%' then
select _label ~* (E'\\m' || _pattern || E'\\M') into _match;
end if;
そして、それは大幅に高速です。