Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment renvoyer les résultats de la requête sous forme de liste séparée par des virgules dans SQL Server - STRING_AGG()

À 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