Dosavadní odpovědi na vaši otázku neodpovídají:
Nezáleží na tom, zda použijete LIKE
nebo =
pokud odpovídáte celému řetězci (a nejsou žádné zástupné znaky v váš řetězec). Aby bylo vyhledávání nejasné, musíte nahradit součástí vzoru, nejen k němu přidat.
Například pro shodu na posledních 7 (místo 8) znaků subcolumn
:
SELECT *
FROM maintable m
WHERE left(maincolumn, 8) LIKE
( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
Používám jednodušší left()
(představeno s Postgres 9.1).
Můžete could
zjednodušte to na:
SELECT *
FROM maintable m
WHERE left(maincolumn, 7) =
(SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
Ale neudělali byste to, pokud byste použili speciální index, o kterém se zmiňuji níže, protože výrazy ve funkčních indexech se musí přesně shodovat, aby byly použitelné.
Mohlo by vás zajímat rozšíření pg_tgrm
.
V PostgreSQL 9.1 spusťte jednou pro každou databázi:
CREATE EXTENSION pg_tgrm;
Dva důvody:
-
Poskytuje operátor podobnosti
%
. S ním můžete vytvořit inteligentní podobnostní vyhledávání:--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);
-
Poskytuje podporu indexů pro oba
LIKE
a%
Pokud je výkon čtení důležitější než výkon zápisu, doporučuji vám vytvořit funkční GIN nebo GiST index takto:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable USING gist (left(maincolumn, 8) gist_trgm_ops);
Tento index podporuje oba dotazy. Uvědomte si, že to s sebou nese určité náklady na operace zápisu.
Rychlý srovnávací test pro podobný případ v této související odpovědi .