sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan returneres forespørgselsresultater som en kommasepareret liste i SQL Server – STRING_AGG()

Fra og med SQL Server 2017 kan du nu få dine forespørgselsresultater til at blive vist som en liste. Det betyder, at du kan få dit resultatsæt til at blive vist som en kommasepareret liste, en mellemrumssepareret liste eller hvilken som helst separator, du vælger at bruge.

Selvom det er rigtigt, at du kunne opnå den samme effekt før SQL Server 2017, var det en smule besværligt.

Transact-SQL har nu STRING_AGG() funktion, som sammenkæder værdierne af strengudtryk og placerer separatorværdier mellem dem. Dette fungerer stort set på samme måde som MySQL's GROUP_CONCAT() funktion.

Denne artikel giver eksempler, der demonstrerer T-SQL STRING_AGG() funktion.

Eksempel på data

Først, her er nogle eksempeldata.

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   

Eksempel – kommasepareret liste

Så vi kunne tage ovenstående data og bruge STRING_AGG() funktion til at liste alle opgavenavnene i én stor kommasepareret liste.

Sådan:

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

Resultat:

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

Det behøver selvfølgelig ikke nødvendigvis at være adskilt med et komma. Det kan adskilles af ethvert udtryk for NVARCHAR eller VARCHAR type, og det kan være en bogstavelig eller en variabel.

Eksempel – Kombination af kolonner

Vi kunne også bruge CONCAT() funktion til at kombinere to felter sammen, adskilt af deres egen separator.

Eksempel:

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

Eksempel – Null-værdier

Hvis dit resultatsæt indeholder nulværdier, ignoreres disse værdier, og der tilføjes ikke en tilsvarende separator.

Hvis dette ikke er egnet, kan du angive en værdi for null-værdier ved at bruge ISNULL() funktion og indtastning af den værdi, du gerne vil bruge, hver gang der stødes på en nulværdi. Ved at gøre dette sikrer du, at du stadig får et resultat, når en række indeholder en nulværdi.

Overvej f.eks. følgende forespørgsel og resultatsæt:

SELECT TaskCode 
FROM Tasks;

Resultat:

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

Vi kan se, at der er tre nulværdier i resultatsættet.

Hvis vi kører dette gennem STRING_AGG() funktion, får vi dette:

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

Resultat:

cat123, pnt456, rof789

Men hvis vi bruger ISNULL() funktion til at give en pladsholder for alle null-værdier, får vi dette:

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

Resultat:

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

Eksempel – grupperede resultater

Du kan også bruge STRING_AGG() funktion, når du grupperer dit resultatsæt. For eksempel vil du måske have en liste over album grupperet efter kunstner.

For at demonstrere dette, forestil dig en database med to tabeller; Artists og Albums . Der er et til mange forhold mellem disse tabeller. For hver kunstner kan der være mange album.

Så en almindelig forespørgsel, der forbinder begge tabeller, kan se sådan ud:

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, hvis en kunstner har mere end ét album, vises kunstnerens navn flere gange – én gang for hvert album.

Men vi kan bruge STRING_AGG() for at ændre dette, så vi kun viser hver kunstner én gang, efterfulgt af en kommasepareret liste over albums, de har udgivet:

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                        

Eksempel – Bestilling af resultaterne

Du kan bruge en rækkefølgeklausul til at sortere resultaterne inden for den sammenkædede gruppe. Dette gøres med WITHIN GROUP klausul. Når du bruger denne klausul, angiver du rækkefølgen med ORDER BY efterfulgt af enten ASC (til stigende) eller DESC (til faldende).

Eksempel:

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. MAA-dokumentation til Oracle Cloud

  2. Sådan fungerer DATEDIFF() i MariaDB

  3. Multi-Statement TVF'er i Dynamics CRM

  4. Humaniseret eller naturlig nummersortering af blandede ord-og-tal-strenge