Comodín de PostgreSQL LIKE para cualquiera de una lista de palabras

Resuelto chmullig asked hace 13 años • 5 respuestas

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 de 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%')
chmullig avatar Feb 08 '11 06:02 chmullig
Aceptado

PostgreSQL también admite expresiones regulares POSIX completas :

select * from table where value ~* 'foo|bar|baz';

Es ~*para una coincidencia que no distingue entre mayúsculas ~y minúsculas.

Otra opción es utilizar CUALQUIER :

select * from table where value  like any (array['%foo%', '%bar%', '%baz%']);
select * from table where value ilike any (array['%foo%', '%bar%', '%baz%']);

Puede utilizar ANY con cualquier operador que genere 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.

mu is too short avatar Feb 08 '2011 00:02 mu is too short

Puede utilizar SIMILAR TOel operador de Postgres que admite alternancias, es decir

select * from table where lower(value) similar to '%(foo|bar|baz)%';
Nordic Mainframe avatar Feb 07 '2011 23:02 Nordic Mainframe

En realidad existe un operador para eso en PostgreSQL:

SELECT *
FROM table
WHERE lower(value) ~~ ANY('{%foo%,%bar%,%baz%}');
jlandercy avatar Oct 08 '2017 21:10 jlandercy