As respostas até agora não atendem à sua pergunta:
Não faz diferença se você usa
LIKE
ou =
contanto que você corresponda a toda a string (e não haja nenhum caractere curinga em sua corda). Para tornar a pesquisa confusa, você precisa substituir parte do padrão, não apenas adicionar a ele. Por exemplo, para corresponder aos últimos 7 (em vez de 8) caracteres da
subcolumn
:SELECT *
FROM maintable m
WHERE left(maincolumn, 8) LIKE
( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
Eu uso o
left()
mais simples (introduzido com o Postgres 9.1).Você
could
simplifique isso para:SELECT *
FROM maintable m
WHERE left(maincolumn, 7) =
(SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
Mas você não faria isso se usasse o índice especial que mencionei mais abaixo, porque as expressões em índices funcionais precisam corresponder precisamente para serem úteis.
Você pode estar interessado na extensão
pg_tgrm
. No PostgreSQL 9.1, execute uma vez por banco de dados:
CREATE EXTENSION pg_tgrm;
Duas razões:
-
Ele fornece o operador de similaridade%
. Com ele você pode construir uma pesquisa de similaridade inteligente:
--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);
-
Ele fornece suporte de índice para ambosLIKE
e%
Se o desempenho de leitura for mais importante do que o desempenho de gravação, sugiro que você crie um funcional Índice GIN ou GiST como este:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable USING gist (left(maincolumn, 8) gist_trgm_ops);
Este índice oferece suporte a qualquer consulta. Esteja ciente de que ele vem com algum custo para operações de gravação.
Uma referência rápida para um caso semelhante nesta resposta relacionada .