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