Certains SGBDR comme MySQL et MariaDB ont un GROUP_CONCAT()
fonction qui vous permet de renvoyer une colonne de requête sous forme de liste délimitée (par exemple, une liste séparée par des virgules).
PostgreSQL a une fonction similaire appelée STRING_AGG()
. Cette fonction fonctionne à peu près de la même manière que GROUP_CONCAT()
fonctionne dans MySQL et MariaDB.
Exemple
Voici un exemple de base pour montrer comment le STRING_AGG()
de PostgreSQL la fonction fonctionne :
SELECT STRING_AGG(genre, ',') FROM Genres;
Résultat :
Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
Voici ce qui se passe lorsque nous effectuons simplement la requête sans le STRING_AGG()
fonction :
SELECT genre FROM Genres;
Résultat :
+---------+ | genre | +---------+ | Rock | | Jazz | | Country | | Pop | | Blues | | Hip Hop | | Rap | | Punk | +---------+ (8 rows)
Nous obtenons huit lignes, chacune avec une valeur distincte, au lieu d'une longue ligne séparée par des virgules de toutes les valeurs.
Si quoi que ce soit, le STRING_AGG()
de PostgreSQL ressemble plus au GROUP_CONCAT()
de MySQL que la fonction de MariaDB du même nom. Je dis cela parce que le GROUP_CONCAT()
de MariaDB nous permet de fournir une LIMIT
clause (à partir de MariaDB 10.3.3), directement depuis la fonction elle-même. MySQL GROUP_CONCAT()
ne prend pas en charge la LIMIT
clause, et la clause STRING_AGG()
de PostgreSQL non plus fonction (du moins, pas au moment d'écrire ces lignes).
Une autre différence est que STRING_AGG()
de PostgreSQL nécessite un deuxième argument (qui spécifie le délimiteur à utiliser). MySQL et MariaDB rendent cela facultatif avec leur GROUP_CONCAT()
fonctions.
STRING_AGG()
de Postgres accepte un ORDER BY
clause, et une DISTINCT
clause (tout comme MariaDB et MySQL GROUP_CONCAT()
fonctions).
Voir STRING_AGG()
Fonction dans PostgreSQL pour plus d'exemples.
Et au cas où vous seriez intéressé, SQL Server a également un STRING_AGG()
fonction qui fonctionne à peu près de la même manière.