Il est également important de comprendre que ANY
n'est pas un opérateur mais une construction SQL qui ne peut être utilisée qu'à droite d'un opérateur. Plus :
- Comment utiliser ANY au lieu de IN dans une clause WHERE avec Rails ?
Le LIKE
opérateur - ou plus précisément :expression , qui est réécrit avec le ~~
opérateur dans Postgres en interne - attend la valeur à gauche et le motif À droite. Il n'y a pas de COMMUTATOR
pour cet opérateur (comme pour l'opérateur d'égalité simple =
) afin que Postgres ne puisse pas inverser les opérandes.
Votre tentative :
select * from someTable where '%someInput%' LIKE ANY(someColum);
a inversé l'opérande gauche et droit donc '%someInput%'
est la valeur et les éléments de la colonne tableau someColum
sont considérés comme des modèles (ce qui n'est pas ce que vous voulez).
Cela serait doit être ANY(someColum) LIKE '%someInput%'
- sauf que ce n'est pas possible avec le ANY
construction qui n'est autorisée qu'à droite d'un opérateur. Vous frappez un barrage routier ici.
Connexe :
- Existe-t-il un moyen d'indexer utilement une colonne de texte contenant des modèles d'expressions régulières ?
- Est-ce que PostgreSQL peut indexer les colonnes d'un tableau ?
Vous pouvez normaliser votre conception relationnelle et enregistrer des éléments du tableau dans des lignes séparées dans un tableau séparé. Sauf cela, unnest()
est la solution, car vous vous êtes déjà trouvé. Mais alors que vous n'êtes intéressé que par l'existence d'au moins un élément correspondant, un EXISTS
la sous-requête sera la plus efficace tout en évitant les doublons dans le résultat - Postgres peut arrêter la recherche dès que la première correspondance est trouvée :
SELECT *
FROM tbl
WHERE EXISTS (
SELECT -- can be empty
FROM unnest(someColum) elem
WHERE elem LIKE '%someInput%'
);
Vous voudrez peut-être échapper un caractère spécial dans someInput
. Voir :
- Fonction d'échappement pour les expressions régulières ou les modèles LIKE
Attention à la négation (NOT LIKE ALL (...)
) lorsque NULL
peut être impliqué :
- Vérifier si NULL existe dans le tableau Postgres