PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Rechercher des lignes où le tableau de texte contient une valeur similaire à l'entrée

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