Tengo una lista simple de ~ 25 palabras. Tengo un campo varchar en PostgreSQL, digamos que la lista es ['foo', 'bar', 'baz']
. Quiero encontrar cualquier fila en mi tabla que tenga alguna de esas palabras. Esto funcionará, pero me gustaría algo más elegante.
select *
from table
where (lower(value) like '%foo%' or lower(value) like '%bar%' or lower(value) like '%baz%')
sql
postgresql
chmullig
fuente
fuente
SIMILAR TO
se traduce internamente a una búsqueda de expresiones regulareslower()
es ineficaz porque primero se convertirá cada cadena a minúsculas, lo que es más costoso que solamente un partido entre mayúsculas y minúsculasPostgreSQL también admite expresiones regulares POSIX completas :
El
~*
es para una coincidencia entre mayúsculas y minúsculas,~
es sensible a mayúsculas y minúsculasOtra opción es usar CUALQUIERA :
Puede usar CUALQUIERA con cualquier operador que produzca un valor booleano. Sospecho que las opciones de expresiones regulares serían más rápidas, pero CUALQUIERA es una herramienta útil para tener en su caja de herramientas.
fuente
En realidad, hay un operador para eso en PostgreSQL:
fuente
~~
es sólo otro nombre paralike
: "El operador~~
es equivalente aLIKE
, y~~*
corresponde aILIKE
Existen también.!~~
y!~~*
operadores que representanNOT LIKE
yNOT ILIKE
, respectivamente Todos estos operadores son PostgreSQL-específica.". . Y'{%foo%,%bar%,%baz%}'
es la forma de texto dearray['%foo%', '%bar%', '%baz%']
.SIMILAR TO
se convierte en expresión regular, el~
operador representa la expresión regular POSIX, pero esto no está claroLIKE
.Una solución 'elegante' sería utilizar la búsqueda de texto completo: http://www.postgresql.org/docs/9.0/interactive/textsearch.html . Entonces usarías consultas de búsqueda de texto completo.
fuente