À partir de SQL Server 2017, vous pouvez désormais faire apparaître les résultats de votre requête sous forme de liste. Cela signifie que vous pouvez faire apparaître votre jeu de résultats sous forme de liste séparée par des virgules, une liste séparée par des espaces ou tout autre séparateur que vous choisissez d'utiliser.
S'il est vrai que vous pouviez obtenir le même effet avant SQL Server 2017, c'était un peu fastidieux.
Transact-SQL a maintenant le STRING_AGG()
fonction, qui concatène les valeurs des expressions de chaîne et place des valeurs de séparation entre elles. Cela fonctionne à peu près de la même manière que GROUP_CONCAT()
de MySQL fonction.
Cet article fournit des exemples qui illustrent le T-SQL STRING_AGG()
fonction.
Exemple de données
Tout d'abord, voici quelques exemples de données.
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
Exemple – Liste séparée par des virgules
Nous pourrions donc prendre les données ci-dessus et utiliser le STRING_AGG()
fonction pour lister tous les noms de tâches dans une grande liste séparée par des virgules.
Comme ceci :
SELECT STRING_AGG(TaskName, ', ') FROM Tasks;
Résultat :
Feed cats, Water dog, Feed garden, Paint carpet, Clean roof, Feed cats
Bien sûr, il n'est pas nécessaire de le séparer par une virgule. Il peut être séparé par n'importe quelle expression de NVARCHAR
ou VARCHAR
type, et il peut s'agir d'un littéral ou d'une variable.
Exemple – Combinaison de colonnes
Nous pourrions également utiliser le CONCAT()
fonction pour combiner deux champs ensemble, séparés par leur propre séparateur.
Exemple :
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
Exemple – Valeurs nulles
Si votre jeu de résultats contient des valeurs nulles, ces valeurs sont ignorées et un séparateur correspondant n'est pas ajouté.
Si cela ne convient pas, vous pouvez fournir une valeur pour les valeurs nulles en utilisant le ISNULL()
fonction et en transmettant la valeur que vous souhaitez utiliser chaque fois qu'une valeur nulle est rencontrée. Cela garantit que vous obtenez toujours un résultat lorsqu'une ligne contient une valeur nulle.
Par exemple, considérez la requête et l'ensemble de résultats suivants :
SELECT TaskCode FROM Tasks;
Résultat :
TaskCode -------- cat123 null null pnt456 rof789 null
Nous pouvons voir qu'il y a trois valeurs nulles dans le jeu de résultats.
Si nous exécutons cela via le STRING_AGG()
fonction, nous obtenons ceci :
SELECT STRING_AGG(TaskCode, ', ') FROM Tasks;
Résultat :
cat123, pnt456, rof789
Cependant, si nous utilisons le ISNULL()
pour fournir un espace réservé pour toutes les valeurs nulles, nous obtenons ceci :
SELECT STRING_AGG(ISNULL(TaskCode, 'N/A'), ', ') FROM Tasks;
Résultat :
cat123, N/A, N/A, pnt456, rof789, N/A
Exemple – Résultats groupés
Vous pouvez également utiliser le STRING_AGG()
fonction lors du regroupement de votre jeu de résultats. Par exemple, vous voudrez peut-être une liste d'albums regroupés par artiste.
Pour illustrer cela, imaginez une base de données avec deux tables; Artists
et Albums
. Il existe une relation un à plusieurs entre ces tables. Pour chaque artiste, il peut y avoir plusieurs albums.
Ainsi, une requête régulière joignant les deux tables pourrait ressembler à ceci :
USE Music; SELECT ar.ArtistName, al.AlbumName FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId;
Résultat :
ArtistName AlbumName ------------------------- ------------------------ Iron Maiden Powerslave AC/DC Powerage Jim Reeves Singing Down the Lane Devin Townsend Ziltoid the Omniscient Devin Townsend Casualties of Cool Devin Townsend Epicloud Iron Maiden Somewhere in Time Iron Maiden Piece of Mind Iron Maiden Killers Iron Maiden No Prayer for the Dying The Script No Sound Without Silence Buddy Rich Big Swing Face Michael Learns to Rock Blue Night Michael Learns to Rock Eternity Michael Learns to Rock Scandinavia Tom Jones Long Lost Suitcase Tom Jones Praise and Blame Tom Jones Along Came Jones Allan Holdsworth All Night Wrong Allan Holdsworth The Sixteen Men of Tain
Comme vous pouvez le voir, si un artiste a plus d'un album, le nom de l'artiste est listé plusieurs fois - une fois pour chaque album.
Mais nous pouvons utiliser STRING_AGG()
pour changer cela afin que nous listions chaque artiste une seule fois, suivi d'une liste séparée par des virgules des albums qu'ils ont sorti :
USE Music; SELECT ar.ArtistName, STRING_AGG(al.AlbumName, ', ') FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ArtistName;
Résultat :
ArtistName ------------------------- ------------------------------------------------------------------------------ AC/DC Powerage Allan Holdsworth All Night Wrong, The Sixteen Men of Tain Buddy Rich Big Swing Face Devin Townsend Ziltoid the Omniscient, Casualties of Cool, Epicloud Iron Maiden Powerslave, Somewhere in Time, Piece of Mind, Killers, No Prayer for the Dying Jim Reeves Singing Down the Lane Michael Learns to Rock Blue Night, Eternity, Scandinavia The Script No Sound Without Silence Tom Jones Long Lost Suitcase, Praise and Blame, Along Came Jones
Exemple :Ordre des résultats
Vous pouvez utiliser une clause de commande pour ordonner les résultats au sein du groupe concaténé. Cela se fait avec le WITHIN GROUP
clause. Lorsque vous utilisez cette clause, vous spécifiez l'ordre avec ORDER BY
suivi soit de ASC
(pour croissant) ou DESC
(pour descendre).
Exemple :
USE Music; SELECT ar.ArtistName, STRING_AGG(al.AlbumName, ', ') WITHIN GROUP (ORDER BY al.AlbumName DESC) FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ArtistName;
Résultat :
ArtistName ------------------------- ------------------------------------------------------------------------------ AC/DC Powerage Allan Holdsworth The Sixteen Men of Tain, All Night Wrong Buddy Rich Big Swing Face Devin Townsend Ziltoid the Omniscient, Epicloud, Casualties of Cool Iron Maiden Somewhere in Time, Powerslave, Piece of Mind, No Prayer for the Dying, Killers Jim Reeves Singing Down the Lane Michael Learns to Rock Scandinavia, Eternity, Blue Night The Script No Sound Without Silence Tom Jones Praise and Blame, Long Lost Suitcase, Along Came Jones