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 TOse 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 aILIKEExisten también.!~~y!~~*operadores que representanNOT LIKEyNOT ILIKE, respectivamente Todos estos operadores son PostgreSQL-específica.". . Y'{%foo%,%bar%,%baz%}'es la forma de texto dearray['%foo%', '%bar%', '%baz%'].SIMILAR TOse 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