Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So geben Sie Abfrageergebnisse als kommagetrennte Liste in SQL Server zurück – STRING_AGG()

Ab SQL Server 2017 können Sie Ihre Abfrageergebnisse jetzt als Liste anzeigen lassen. Das bedeutet, dass Sie Ihre Ergebnismenge als durch Kommas getrennte Liste, als durch Leerzeichen getrennte Liste oder als beliebiges Trennzeichen Ihrer Wahl anzeigen lassen können.

Es stimmt zwar, dass Sie denselben Effekt vor SQL Server 2017 erzielen konnten, aber es war ein bisschen fummelig.

Transact-SQL hat jetzt den STRING_AGG() -Funktion, die die Werte von Zeichenfolgenausdrücken verkettet und Trennwerte dazwischen platziert. Dies funktioniert ähnlich wie GROUP_CONCAT() von MySQL Funktion.

Dieser Artikel enthält Beispiele, die T-SQL STRING_AGG() demonstrieren Funktion.

Beispieldaten

Hier sind zunächst einige Beispieldaten.

SELECT TaskId, TaskName 
FROM Tasks;

Ergebnis:

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

Beispiel – Kommagetrennte Liste

Wir könnten also die obigen Daten nehmen und STRING_AGG() verwenden Funktion, um alle Aufgabennamen in einer großen, durch Kommas getrennten Liste aufzulisten.

So:

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

Ergebnis:

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

Natürlich muss es nicht unbedingt durch ein Komma getrennt werden. Es kann durch einen beliebigen Ausdruck von NVARCHAR getrennt werden oder VARCHAR Typ, und es kann ein Literal oder eine Variable sein.

Beispiel – Kombinieren von Spalten

Wir könnten auch CONCAT() verwenden Funktion zum Kombinieren zweier Felder, getrennt durch ein eigenes Trennzeichen.

Beispiel:

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

Ergebnis:

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

Beispiel – Nullwerte

Wenn Ihre Ergebnismenge Nullwerte enthält, werden diese Werte ignoriert und es wird kein entsprechendes Trennzeichen hinzugefügt.

Wenn dies nicht geeignet ist, können Sie einen Wert für Nullwerte bereitstellen, indem Sie ISNULL() verwenden Funktion und übergeben Sie den Wert, den Sie verwenden möchten, wenn ein Nullwert gefunden wird. Dadurch wird sichergestellt, dass Sie immer noch ein Ergebnis erhalten, wenn eine Zeile einen Nullwert enthält.

Betrachten Sie beispielsweise die folgende Abfrage und Ergebnismenge:

SELECT TaskCode 
FROM Tasks;

Ergebnis:

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

Wir können sehen, dass die Ergebnismenge drei Nullwerte enthält.

Wenn wir dies durch den STRING_AGG() laufen lassen Funktion erhalten wir Folgendes:

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

Ergebnis:

cat123, pnt456, rof789

Wenn wir jedoch ISNULL() verwenden Funktion, um einen Platzhalter für beliebige Nullwerte bereitzustellen, erhalten wir Folgendes:

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

Ergebnis:

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

Beispiel – Gruppierte Ergebnisse

Sie können auch STRING_AGG() verwenden Funktion beim Gruppieren Ihrer Ergebnismenge. Beispielsweise möchten Sie möglicherweise eine nach Interpreten gruppierte Liste von Alben.

Um dies zu demonstrieren, stellen Sie sich eine Datenbank mit zwei Tabellen vor; Artists und Albums . Zwischen diesen Tabellen besteht eine Eins-zu-Viele-Beziehung. Für jeden Künstler könnte es viele Alben geben.

Eine normale Abfrage, die beide Tabellen verbindet, könnte also etwa so aussehen:

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

Ergebnis:

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 

Wie Sie sehen können, wird der Name des Künstlers, wenn er mehr als ein Album hat, mehrmals aufgeführt – einmal für jedes Album.

Aber wir können STRING_AGG() verwenden um dies so zu ändern, dass wir jeden Künstler nur einmal auflisten, gefolgt von einer durch Kommas getrennten Liste der Alben, die er veröffentlicht hat:

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

Ergebnis:

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                        

Beispiel – Sortieren der Ergebnisse

Sie können eine Ordnungsklausel verwenden, um die Ergebnisse innerhalb der verketteten Gruppe zu ordnen. Dies geschieht mit dem WITHIN GROUP Klausel. Wenn Sie diese Klausel verwenden, geben Sie die Reihenfolge mit ORDER BY an gefolgt von entweder ASC (für aufsteigend) oder DESC (für absteigend).

Beispiel:

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;

Ergebnis:

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