Las respuestas hasta ahora no abordan su pregunta:
Apenas hace ninguna diferencia si usa LIKE
o =
siempre y cuando coincida con toda la cadena (y no haya ningún carácter comodín en su cadena). Para que la búsqueda sea confusa, debe reemplazar parte del patrón, no solo agregarlo.
Por ejemplo, para hacer coincidir los últimos 7 (en lugar de 8) caracteres de subcolumn
:
SELECT *
FROM maintable m
WHERE left(maincolumn, 8) LIKE
( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
Uso el left()
más simple (introducido con Postgres 9.1).
Usted could
simplifica esto a:
SELECT *
FROM maintable m
WHERE left(maincolumn, 7) =
(SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
Pero no lo haría si usa el índice especial que menciono más adelante, porque las expresiones en los índices funcionales tienen que coincidir con precisión para ser útiles.
Puede que te interese la extensión pg_tgrm
.
En PostgreSQL 9.1, ejecute una vez por base de datos:
CREATE EXTENSION pg_tgrm;
Dos razones:
-
Proporciona el operador de similitud
%
. Con él puedes construir una búsqueda de similitud 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);
-
Proporciona compatibilidad con índices para ambos
LIKE
y%
Si el rendimiento de lectura es más importante que el rendimiento de escritura, le sugiero que cree un funcional Índice GIN o GiST como este:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable USING gist (left(maincolumn, 8) gist_trgm_ops);
Este índice admite cualquier consulta. Tenga en cuenta que las operaciones de escritura tienen un costo.
Un punto de referencia rápido para un caso similar en esta respuesta relacionada .