これまでの回答はあなたの質問に対応していません:
しかし、クエリで Like 、 % 、 _ などを使用して、パターンを大まかに一致させたい (つまり、8 文字すべてではない)。
文字列全体に一致する限り、または文字列にワイルドカード文字が含まれていない限り、LIKE
使用するかどうかにほとんど違いはありません。検索をあいまいにするには、パターンに追加するだけでなく、パターンの一部を置き換える必要があります。=
たとえば、 の最後の 7 文字 (8 文字ではなく) を照合するには、次のようにしsubcolumn
ます。
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);
このインデックスは、どちらのクエリもサポートしています。書き込み操作にはいくらかのコストがかかることに注意してください。
この関連する回答 の同様のケースの簡単なベンチマーク。