CodeGym /Cours /SQL SELF /Recherche de données dans un array : ANY, ...

Recherche de données dans un array : ANY, ALL, array_contains()

SQL SELF
Niveau 35, Leçon 4
Disponible

Les arrays sont souvent utilisés pour stocker plusieurs valeurs dans une seule colonne — genre des tags, des numéros, des rôles ou des préférences. Mais comment savoir si une valeur qu’on cherche est dans l’array, ou au contraire si tous les éléments respectent une certaine condition ? PostgreSQL propose des outils bien pratiques pour ça : ANY, ALL et array_contains(). On va les décortiquer un par un.

C’est quoi ANY ?

Imagine que t’as un array avec plusieurs valeurs, genre des IDs de produits, des numéros de téléphone ou une liste de hobbies. Souvent, tu veux checker si une certaine valeur est présente dans l’array. C’est là que l’opérateur ANY entre en jeu. Il permet de vérifier si "l’objet qu’on cherche" est dans l’array.

Syntaxe de ANY

SELECT *
FROM your_table
WHERE value = ANY(array_column);

Ici :

  • array_column — c’est l’array qu’on vérifie.
  • value — c’est la valeur qu’on cherche dans l’array.

Exemple d’utilisation de ANY

Imaginons qu’on a une table students avec cette structure :

id name hobbies
1 Otto {lecture, natation, échecs}
2 Eva {musique, lecture, sport}
3 Alex {dessin, musique}
4 Maria {échecs, foot}

On veut trouver les étudiants qui ont la natation parmi leurs hobbies. La requête sera :

SELECT *
FROM students
WHERE 'natation' = ANY(hobbies);

Résultat :

id name hobbies
1 Otto {lecture, natation, échecs}

En gros, ANY vérifie : "Est-ce que cette valeur est dans l’array ?".

Fais confiance, mais vérifie tout ! Utilise ALL

Maintenant, imagine le cas inverse : tu veux t’assurer que tous les éléments de l’array respectent une règle. Pour ça, PostgreSQL propose l’opérateur ALL. Avec lui, tu peux vérifier si tous les éléments de l’array, par exemple, sont égaux à une valeur, sont supérieurs à un certain nombre ou respectent n’importe quelle condition logique.

Syntaxe de ALL

SELECT *
FROM your_table
WHERE value < ALL(array_column);

Ici :

  • array_column — c’est l’array qu’on vérifie.
  • value < ALL(...) veut dire que tous les éléments de l’array doivent être supérieurs à la valeur.

Revenons à notre table students. Disons qu’on veut trouver les étudiants dont tous les hobbies commencent par la lettre "l". La requête :

SELECT *
FROM students
WHERE 'lecture' = ALL(hobbies);

Le résultat sera vide, parce que personne n’a tous ses hobbies égaux à "lecture". Pour que ce soit plus clair (et que ça marche), prenons un exemple avec des données numériques.

Imaginons une table orders :

id customer prices
1 Otto {100, 200, 300}
2 Eva {50, 60, 70}
3 Alex {500, 600, 700}

Trouver toutes les commandes où chaque position coûte moins de 400 :

SELECT *
FROM orders
WHERE 400 > ALL(prices);

Résultat :

id customer prices
1 Otto {100, 200, 300}
2 Eva {50, 60, 70}

Filtrer les lignes selon le contenu d’un array

On a vu les fonctions et opérateurs de base pour chercher des données dans les arrays, mais comment ça s’utilise en vrai ? Voici quelques exemples d’utilisation.

Exemple 1 : Trouver les étudiants qui ont au moins un hobby — musique

Table de départ :

id name hobbies
1 Otto {lecture, musique, course}
2 Eva {dessin, natation}
3 Maria {musique, boxe}
4 Alex {foot, boxe, jeux_de_société}
SELECT *
FROM students
WHERE 'musique' = ANY(hobbies);

Résultat :

id name hobbies
1 Otto {lecture, musique, course}
3 Maria {musique, boxe}

Exemple 2 : Trouver les commandes avec des prix supérieurs à 100 pour toutes les positions

Table de départ orders :

id customer prices
1 Otto {150, 200, 300}
2 Eva {50, 120, 130}
3 Maria {200, 250, 100}
4 Alex {110, 115, 120}
SELECT *
FROM orders
WHERE 100 < ALL(prices);

Résultat :

id customer prices
1 Otto {150, 200, 300}
4 Alex {110, 115, 120}

Erreurs classiques et comment les éviter

Quand tu bosses avec les arrays, surtout pour chercher des données, y’a quelques pièges à éviter.

Erreur : Mauvaise utilisation de ANY ou ALL. Par exemple, si tu inverses les opérateurs par erreur, tu risques d’avoir des résultats chelous.

-- Mauvais exemple :
SELECT *
FROM students
WHERE hobbies = ANY('lecture');

Ici, le souci c’est que hobbies est un array, et 'lecture' est une string. C’est bien l’array qu’on doit checker avec ANY, pas l’inverse.

Erreur : L’indexation des arrays commence à 1, pas à 0. Si tu utilises les arrays dans d’autres fonctions ou que tu veux extraire des éléments à la main, pense à la particularité de PostgreSQL.

Erreur : Pas d’indexation. Si tu utilises souvent les arrays pour faire des recherches (ANY, ALL), indexer peut vraiment accélérer tes requêtes.

2
Mission
SQL SELF, niveau 35, leçon 4
Bloqué
Utilisation de `ANY` pour la recherche dans un tableau
Utilisation de `ANY` pour la recherche dans un tableau
1
Étude/Quiz
Tableaux et comment bosser avec, niveau 35, leçon 4
Indisponible
Tableaux et comment bosser avec
Tableaux et comment bosser avec
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION