これまでのところ、答えはあなたの質問に答えることができません:
LIKE
を使用しても、ほとんど違いはありません。 または=
文字列全体に一致する限り( にワイルドカード文字がない場合) あなたの文字列)。検索をあいまいにするには、置換する必要があります パターンに追加するだけでなく、パターンの一部です。
たとえば、subcolumn
の最後の7文字(8文字ではなく)を照合します :
SELECT *
FROM maintable m
WHERE left(maincolumn, 8) LIKE
( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
より単純なleft()
を使用します (Postgres 9.1で導入されました。)
あなたはcould
これを単純化して:
SELECT *
FROM maintable m
WHERE left(maincolumn, 7) =
(SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
ただし、機能インデックスの式を使用するには正確に一致させる必要があるため、後で説明する特別なインデックスを使用する場合は使用しません。
拡張機能pg_tgrm
に興味があるかもしれません。
。
PostgreSQL 9.1では、データベースごとに1回実行します。
CREATE EXTENSION pg_tgrm;
2つの理由:
-
類似性演算子
%
。これを使用すると、スマートな類似検索を構築できます:--SELECT show_limit(); SELECT set_limit(0.5); -- adjust similarity limit for % operator SELECT * FROM maintable m WHERE left(maincolumn, 8) % (SELECT subcolumn FROM subtable WHERE subid = 2);
-
インデックスサポートを提供します 両方の
LIKE
および%
書き込みパフォーマンスよりも読み取りパフォーマンスの方が重要な場合は、を作成することをお勧めします。機能的 このようなGINまたはGiSTインデックス:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable USING gist (left(maincolumn, 8) gist_trgm_ops);
このインデックスはどちらのクエリもサポートします。書き込み操作にはいくらかのコストがかかることに注意してください。
同様のケースの簡単なベンチマークこの関連する回答で 。