sql >> Database >  >> RDS >> Sqlserver

Queryresultaten retourneren als een door komma's gescheiden lijst in SQL Server - STRING_AGG()

Vanaf SQL Server 2017 kunt u uw queryresultaten nu als een lijst weergeven. Dit betekent dat u uw resultatenset kunt laten verschijnen als een door komma's gescheiden lijst, een door spaties gescheiden lijst of welk scheidingsteken u ook kiest om te gebruiken.

Hoewel het waar is dat je ditzelfde effect vóór SQL Server 2017 kon bereiken, was het een beetje onhandig.

Transact-SQL heeft nu de STRING_AGG() functie, die de waarden van tekenreeksuitdrukkingen samenvoegt en scheidingstekens ertussen plaatst. Dit werkt op vrijwel dezelfde manier als MySQL's GROUP_CONCAT() functie.

Dit artikel bevat voorbeelden die de T-SQL STRING_AGG() . demonstreren functie.

Voorbeeldgegevens

Hier volgen eerst enkele voorbeeldgegevens.

SELECT TaskId, TaskName 
FROM Tasks;

Resultaat:

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

Voorbeeld – Door komma's gescheiden lijst

Dus we kunnen de bovenstaande gegevens nemen en de STRING_AGG() . gebruiken functie om alle taaknamen in één grote door komma's gescheiden lijst weer te geven.

Zoals dit:

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

Resultaat:

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

Het hoeft natuurlijk niet per se te worden gescheiden door een komma. Het kan worden gescheiden door elke uitdrukking van NVARCHAR of VARCHAR type, en het kan een letterlijke of een variabele zijn.

Voorbeeld – Kolommen combineren

We kunnen ook de CONCAT() . gebruiken functie om twee velden samen te voegen, gescheiden door hun eigen scheidingsteken.

Voorbeeld:

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

Resultaat:

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

Voorbeeld – Null-waarden

Als uw resultatenset null-waarden bevat, worden die waarden genegeerd en wordt er geen bijbehorend scheidingsteken toegevoegd.

Als dit niet geschikt is, kunt u een waarde voor null-waarden opgeven met behulp van de ISNULL() functie en geef de waarde door die u wilt gebruiken wanneer een null-waarde wordt aangetroffen. Als u dit doet, zorgt u ervoor dat u nog steeds een resultaat krijgt als een rij een null-waarde bevat.

Beschouw bijvoorbeeld de volgende query en resultatenset:

SELECT TaskCode 
FROM Tasks;

Resultaat:

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

We kunnen zien dat er drie null-waarden zijn in de resultaatset.

Als we dit door de STRING_AGG() functie krijgen we dit:

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

Resultaat:

cat123, pnt456, rof789

Als we echter de ISNULL() functie om een ​​tijdelijke aanduiding te bieden voor alle null-waarden, krijgen we dit:

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

Resultaat:

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

Voorbeeld – Gegroepeerde resultaten

U kunt ook de STRING_AGG() . gebruiken functie bij het groeperen van uw resultatenset. U wilt bijvoorbeeld een lijst met albums, gegroepeerd op artiest.

Om dit te demonstreren, stel je een database voor met twee tabellen; Artists en Albums . Er is een één-op-veel relatie tussen deze tabellen. Voor elke artiest kunnen er veel albums zijn.

Dus een gewone query die beide tabellen verbindt, kan er ongeveer zo uitzien:

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

Resultaat:

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 

Zoals je kunt zien, wordt de naam van de artiest meerdere keren vermeld als een artiest meer dan één album heeft, één keer voor elk album.

Maar we kunnen STRING_AGG() . gebruiken om dit te wijzigen zodat we elke artiest slechts één keer vermelden, gevolgd door een door komma's gescheiden lijst van albums die ze hebben uitgebracht:

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

Resultaat:

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                        

Voorbeeld – De resultaten bestellen

U kunt een orderclausule gebruiken om de resultaten binnen de aaneengeschakelde groep te ordenen. Dit doe je met de WITHIN GROUP clausule. Wanneer u deze clausule gebruikt, geeft u de bestelling op met ORDER BY gevolgd door ofwel ASC (voor oplopend) of DESC (voor aflopend).

Voorbeeld:

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;

Resultaat:

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. Hoe MariaDB Database in Debian 10 te installeren

  2. Problemen oplossen bij het werken met datum en tijd in SQL Server

  3. Een lijst met e-mails retourneren die zijn verzonden vanuit SQL Server Database Mail (T-SQL)

  4. Sql-serverunie maar houd de volgorde aan