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