La plupart des principaux SGBDR ont une fonction qui nous permet de renvoyer les résultats de nos requêtes sous forme de liste séparée par des virgules.
Autrement dit, nous pouvons utiliser une telle fonction pour convertir chaque ligne en un élément de liste séparé, dans une liste séparée par des virgules.
Vous trouverez ci-dessous des exemples de la manière d'y parvenir dans certains des SGBDR les plus populaires.
MySQL
MySQL a le GROUP_CONCAT()
fonction qui nous permet d'afficher les résultats de notre requête dans une liste séparée par des virgules :
SELECT GROUP_CONCAT(PetName)
FROM Pets;
Résultat :
Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow
Nous pouvons également faire des choses comme, supprimer les valeurs en double (avec le DISTINCT
clause), spécifiez un ordre pour les résultats (avec la ORDER BY
clause), et spécifiez un délimiteur différent.
Voir GROUP_CONCAT()
Fonction dans MySQL pour plus d'exemples.
Base de données Oracle
Oracle Database a le LISTAGG()
fonction :
SELECT LISTAGG(last_name, ', ')
FROM employees
WHERE job_id = 'IT_PROG';
Résultat :
Hunold, Ernst, Austin, Pataballa, Lorentz
Comme MySQL, Oracle Database nous permet également de supprimer les valeurs en double, de spécifier un ordre pour les résultats, de spécifier un séparateur différent, etc.
Voir LISTAGG()
Fonction dans Oracle pour plus d'exemples.
SQL Server
SQL Server a le STRING_AGG()
fonction pour renvoyer nos résultats dans une liste séparée par des virgules :
SELECT STRING_AGG(Genre, ',') AS Result FROM Genres
Résultat :
Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
Nous pouvons également supprimer les valeurs en double, spécifier un ordre pour les résultats, modifier le délimiteur, etc.
Voir Comment renvoyer les résultats d'une requête sous forme de liste séparée par des virgules dans SQL Server pour plus d'exemples.
MariaDB
Comme MySQL, MariaDB a également un GROUP_CONCAT()
fonction :
SELECT GROUP_CONCAT(PetName)
FROM Pets;
Résultat :
Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow
Comme la fonction MySQL du même nom, nous pouvons également faire des choses comme, supprimer les valeurs en double (avec le DISTINCT
clause), spécifiez un ordre pour les résultats (avec la ORDER BY
clause), changer le séparateur, etc.
Cependant, une chose que MariaDB a sur MySQL est le LIMIT
clause, qui nous donne la possibilité de limiter le nombre de résultats dans la liste.
Voir MariaDB GROUP_CONCAT()
pour plus d'exemples.
PostgreSQL
Postgres a le STRING_AGG()
fonction :
SELECT STRING_AGG(PetName, ',')
FROM Pets;
Résultat :
Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow
Nous pouvons également supprimer les valeurs en double (avec le DISTINCT
clause), spécifiez un ordre pour les résultats (avec la ORDER BY
clause), changer le séparateur, etc.
Voir STRING_AGG()
Fonction dans PostgreSQL pour plus d'exemples.
SQLite
Dans SQLite, nous pouvons utiliser le GROUP_CONCAT()
fonction pour transformer nos résultats de requête en une liste séparée par des virgules :
SELECT group_concat(FirstName)
FROM Employee;
Résultat :
Andrew,Nancy,Jane,Margaret,Steve,Michael,Robert,Laura
Voir comment GROUP_CONCAT()
Fonctionne dans SQLite pour plus d'exemples.
Colonnes multiples
Les exemples ci-dessus utilisent tous une seule colonne pour la liste. Nous pouvons également concaténer plusieurs colonnes pour produire une liste qui comprend plusieurs colonnes.
Supposons que nous ayons un tableau avec les données suivantes :
SELECT TaskId, TaskName
FROM Tasks;
Résultat :
TaskId TaskName ------ ------------ 1 Feed cats 2 Water dog 3 Feed garden 4 Paint carpet 5 Clean roof 6 Feed cats
Dans SQL Server, nous pouvons effectuer les opérations suivantes pour afficher les deux colonnes sur une seule ligne :
SELECT STRING_AGG(CONCAT(TaskId, ') ', TaskName), ' ')
FROM Tasks
Résultat :
1) Feed cats 2) Water dog 3) Feed garden 4) Paint carpet 5) Clean roof 6) Feed cats