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.
GO TO FULL VERSION