J'ai une simple liste d'environ 25 mots. J'ai un champ varchar dans PostgreSQL, disons que cette liste est ['foo', 'bar', 'baz']
. Je veux trouver n'importe quelle ligne de mon tableau contenant l'un de ces mots. Cela fonctionnera, mais j'aimerais quelque chose de plus élégant.
select *
from table
where (lower(value) like '%foo%' or lower(value) like '%bar%' or lower(value) like '%baz%')
sql
postgresql
chmullig
la source
la source
SIMILAR TO
est traduit en interne en une recherche regexlower()
est inefficace car elle convertira d'abord chaque chaîne en minuscules, ce qui est plus coûteux qu'une seule correspondance insensible à la cassePostgreSQL prend également en charge les expressions régulières POSIX complètes :
L'
~*
est pour une correspondance insensible à la casse,~
est sensible à la casse.Une autre option consiste à utiliser TOUT :
Vous pouvez utiliser ANY avec n'importe quel opérateur qui produit un booléen. Je soupçonne que les options regex seraient plus rapides, mais ANY est un outil utile à avoir dans votre boîte à outils.
la source
En fait, il existe un opérateur pour cela dans PostgreSQL:
la source
~~
est juste un autre nom pourlike
: "L'opérateur~~
est équivalent àLIKE
, et~~*
correspond àILIKE
. Il existe également des opérateurs!~~
et!~~*
qui représententNOT LIKE
etNOT ILIKE
, respectivement. Tous ces opérateurs sont spécifiques à PostgreSQL." . Et'{%foo%,%bar%,%baz%}'
est la forme de texte dearray['%foo%', '%bar%', '%baz%']
.SIMILAR TO
se transforme en expression régulière, l'~
opérateur signifie expression régulière POSIX, mais ce n'est pas clair pourLIKE
.Une solution «élégante» serait d'utiliser la recherche en texte intégral: http://www.postgresql.org/docs/9.0/interactive/textsearch.html . Ensuite, vous utiliseriez des requêtes de recherche en texte intégral.
la source