Extraction des données d’un tableau : unnest(), array_length(), array_position()
Travailler avec les tableaux, ce n’est pas juste les créer et les stocker — souvent, t’as besoin d’extraire des éléments ou d’analyser leur contenu. PostgreSQL propose plusieurs fonctions intégrées pour ce genre d’opérations. On va les voir une par une.
Fonction unnest() : déballer un tableau
La fonction unnest() déballe littéralement un tableau, en transformant ses éléments en lignes séparées. C’est super utile si tu veux manipuler les données du tableau comme une table.
Exemple 1 : Déballage simple d’un tableau
Imaginons qu’on a un tableau avec des noms de facultés :
SELECT ARRAY['Informatique', 'Mathématiques', 'Physique'] AS facultes;
Maintenant, on veut extraire chaque élément comme une ligne séparée. On utilise unnest() :
SELECT unnest(ARRAY['Informatique', 'Mathématiques', 'Physique']) AS faculte;
Résultat :
| faculte |
|---|
| Informatique |
| Mathématiques |
| Physique |
Exemple 2 : Déballer un tableau dans une table
Supposons qu’on a une table courses :
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY,
course_name TEXT,
tags TEXT[]
);
INSERT INTO courses (course_name, tags)
VALUES
('Algorithmes', ARRAY['Programmation', 'Informatique']),
('Algèbre linéaire', ARRAY['Mathématiques', 'Algèbre']),
('Physique de base', ARRAY['Physique', 'Général']);
Maintenant, on va extraire tous les tags du tableau :
SELECT course_name, unnest(tags) AS tag
FROM courses;
Résultat :
| course_name | tag |
|---|---|
| Algorithmes | Programmation |
| Algorithmes | Informatique |
| Algèbre linéaire | Mathématiques |
| Algèbre linéaire | Algèbre |
| Physique de base | Physique |
| Physique de base | Général |
Tu vois, chaque élément du tableau devient une ligne séparée dans la table.
Fonction array_length() : déterminer la taille d’un tableau
La deuxième fonction importante pour bosser avec les tableaux, c’est array_length(). Elle te donne la longueur du tableau (c’est-à-dire le nombre d’éléments) pour la dimension indiquée.
Exemple 1 : Nombre d’éléments dans un tableau à une dimension
Prenons un tableau :
SELECT ARRAY['Pomme', 'Banane', 'Orange'] AS fruits;
Si tu veux savoir combien de fruits il y a dans le tableau :
SELECT array_length(ARRAY['Pomme', 'Banane', 'Orange'], 1) AS longueur;
Résultat :
| longueur |
|---|
| 3 |
Ici, 1 indique la dimension du tableau. Les tableaux dans PostgreSQL peuvent avoir plusieurs dimensions (genre des tableaux à deux dimensions), mais ça, on en parlera une autre fois.
Exemple 2 : Nombre d’éléments dans un tableau d’une table
Voyons combien de tags chaque cours possède :
SELECT course_name, array_length(tags, 1) AS nombre_de_tags
FROM courses;
Résultat :
| course_name | nombre_de_tags |
|---|---|
| Algorithmes | 2 |
| Algèbre linéaire | 2 |
| Physique de base | 2 |
La fonction te dit juste : « Hey, ici y’a deux éléments ! », et ça simplifie déjà pas mal l’analyse des données.
Fonction array_position() : chercher une valeur dans un tableau
Maintenant, imagine que tu cherches un élément précis dans un tableau. La fonction array_position() est là pour ça : elle te donne la position de la première occurrence de l’élément.
Exemple 1 : Chercher un élément
Imaginons qu’on a un tableau :
SELECT ARRAY['Rouge', 'Bleu', 'Vert', 'Jaune'] AS couleurs;
Essayons de trouver la position de l’élément "Bleu" :
SELECT array_position(ARRAY['Rouge', 'Bleu', 'Vert', 'Jaune'], 'Bleu') AS position;
Résultat :
| position |
|---|
| 2 |
Si l’élément n’est pas là, la fonction renvoie NULL. On va vérifier :
SELECT array_position(ARRAY['Rouge', 'Bleu', 'Vert', 'Jaune'], 'Noir') AS position;
Résultat :
| position |
|---|
| NULL |
Exemple 2 : Chercher dans un tableau d’une table
Tu veux savoir quel cours a le tag "Informatique". D’abord, on trouve les lignes concernées :
SELECT course_name, array_position(tags, 'Informatique') AS position
FROM courses;
Résultat :
| course_name | position |
|---|---|
| Algorithmes | 2 |
| Algèbre linéaire | NULL |
| Physique de base | NULL |
Maintenant, ajoute un filtre pour ne garder que les lignes où le tag existe :
SELECT course_name
FROM courses
WHERE array_position(tags, 'Informatique') IS NOT NULL;
Résultat :
| course_name |
|---|
| Algorithmes |
La fonction array_position() permet de trouver rapidement des données dans un tableau, ce qui en fait une des fonctions clés pour bosser avec les tableaux dans PostgreSQL.
Utilisation pratique des fonctions
unnest()— à utiliser pour transformer les tableaux en lignes. C’est super important pour l’analyse de données, la création de rapports et la gestion des tags.array_length()— parfait pour vérifier la longueur des tableaux. Par exemple, tu peux t’en servir pour valider les données : vérifier qu’un tableau n’est pas vide.array_position()— un super outil pour chercher des éléments, que ce soit des catégories de produits, la participation d’un étudiant à un projet ou des mots-clés dans une description.
Erreurs fréquentes avec ces fonctions
unnest()peut doubler le nombre de lignes si tu l’utilises sur plusieurs colonnes de tableaux en même temps. Tu peux régler ça avecJOIN LATERALouCROSS JOIN, mais fais gaffe.array_length()renvoieNULLpour un tableau vide. Si ton tableau peut être vide, pense à vérifier ce cas à part.array_position()peut renvoyerNULLsi l’élément n’existe pas. Donc, pense toujours à gérer ce cas dans tes filtres (IS NOT NULL).
Exemples concrets
Les tableaux dans PostgreSQL, ce n’est pas juste de la théorie, c’est un vrai outil qui marche super bien dans les projets réels. Par exemple, tu tiens un blog et chaque article a une liste de tags — le tableau te permet de filtrer facilement les articles par thème ou même de faire un top des catégories populaires.
Ou alors, tu analyses le comportement des utilisateurs qui choisissent plusieurs cours ou produits. Toutes ces préférences, c’est pratique de les stocker dans un tableau — et tout aussi pratique à traiter.
Et puis, les tableaux aident à valider les données : avec array_length(), tu peux par exemple limiter le nombre d’éléments — genre pour empêcher un utilisateur de choisir plus de cinq options.
GO TO FULL VERSION