sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man returnerar frågeresultat som en kommaseparerad lista i SQL Server – STRING_AGG()

Från och med SQL Server 2017 kan du nu få dina frågeresultat att visas som en lista. Det betyder att du kan få din resultatuppsättning att visas som en kommaseparerad lista, en blankstegsseparerad lista eller vilken avgränsare du väljer att använda.

Även om det är sant att du kunde uppnå samma effekt före SQL Server 2017, var det lite krångligt.

Transact-SQL har nu STRING_AGG() funktion, som sammanfogar värdena för stränguttryck och placerar separatorvärden mellan dem. Detta fungerar ungefär på samma sätt som MySQL:s GROUP_CONCAT() funktion.

Den här artikeln ger exempel som visar T-SQL STRING_AGG() funktion.

Exempeldata

Först, här är några exempeldata.

SELECT TaskId, TaskName 
FROM Tasks;

Resultat:

TaskId  TaskName    
------  ------------
1       Feed cats   
2       Water dog   
3       Feed garden 
4       Paint carpet
5       Clean roof  
6       Feed cats   

Exempel – kommaseparerad lista

Så vi kunde ta ovanstående data och använda STRING_AGG() funktion för att lista alla uppgiftsnamn i en stor kommaseparerad lista.

Så här:

SELECT STRING_AGG(TaskName, ', ') 
FROM Tasks;

Resultat:

Feed cats, Water dog, Feed garden, Paint carpet, Clean roof, Feed cats   

Naturligtvis behöver det inte nödvändigtvis separeras med ett kommatecken. Det kan separeras med valfritt uttryck av NVARCHAR eller VARCHAR typ, och det kan vara en bokstavlig eller en variabel.

Exempel – Kombinera kolumner

Vi kan också använda CONCAT() funktion för att kombinera två fält tillsammans, åtskilda av sin egen avgränsare.

Exempel:

SELECT STRING_AGG(CONCAT(TaskId, ') ', TaskName), ' ') 
FROM Tasks;

Resultat:

1) Feed cats 2) Water dog 3) Feed garden 4) Paint carpet 5) Clean roof 6) Feed cats

Exempel – Nullvärden

Om din resultatuppsättning innehåller nollvärden ignoreras dessa värden och en motsvarande avgränsare läggs inte till.

Om detta inte är lämpligt kan du ange ett värde för nullvärden genom att använda ISNULL() funktion och skicka in det värde du vill använda när ett nullvärde påträffas. Genom att göra detta säkerställer du att du fortfarande får ett resultat när en rad innehåller ett nollvärde.

Tänk till exempel på följande fråga och resultatuppsättning:

SELECT TaskCode 
FROM Tasks;

Resultat:

TaskCode
--------
cat123  
null    
null    
pnt456  
rof789  
null    

Vi kan se att det finns tre nollvärden inom resultatuppsättningen.

Om vi ​​kör detta genom STRING_AGG() funktion får vi detta:

SELECT STRING_AGG(TaskCode, ', ') 
FROM Tasks;

Resultat:

cat123, pnt456, rof789

Men om vi använder ISNULL() funktion för att tillhandahålla en platshållare för eventuella nollvärden, får vi detta:

SELECT STRING_AGG(ISNULL(TaskCode, 'N/A'), ', ') 
FROM Tasks;

Resultat:

cat123, N/A, N/A, pnt456, rof789, N/A

Exempel – grupperade resultat

Du kan också använda STRING_AGG() funktion när du grupperar din resultatuppsättning. Du kanske till exempel vill ha en lista över album grupperade efter artist.

För att demonstrera detta, föreställ dig en databas med två tabeller; Artists och Albums . Det finns ett ett till många förhållande mellan dessa tabeller. För varje artist kan det finnas många album.

Så en vanlig fråga som förenar båda tabellerna kan se ut ungefär så här:

USE Music;
SELECT ar.ArtistName,
	al.AlbumName
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId;

Resultat:

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 

Som du kan se, om en artist har mer än ett album, listas artistens namn flera gånger – en gång för varje album.

Men vi kan använda STRING_AGG() för att ändra detta så att vi listar varje artist bara en gång, följt av en kommaseparerad lista över album de har släppt:

USE Music;
SELECT ar.ArtistName,
	STRING_AGG(al.AlbumName, ', ')
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
GROUP BY ArtistName;

Resultat:

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                        

Exempel – Beställning av resultaten

Du kan använda en ordningsklausul för att ordna resultaten inom den sammanlänkade gruppen. Detta görs med WITHIN GROUP klausul. När du använder den här klausulen anger du beställningen med ORDER BY följt av antingen ASC (för stigande) eller DESC (för fallande).

Exempel:

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;
>

Resultat:

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                        

  1. SQL Server Interns:Problematiska operatörer Pt. II – Hashing

  2. konvertera datumsträng till mysql datetime-fält

  3. PostgreSQL återkallar behörigheter från pg_catalog-tabeller

  4. Hur du skyddar din MySQL- eller MariaDB-databas från SQL-injektion:Del två