Från och med SQL Server 2017 kan du nu få dina frågeresultat att visas som en lista. Det betyder att du kan få din resultatuppsättning att visas som en kommaseparerad lista, en blankstegsseparerad lista eller vilken avgränsare du väljer att använda.
Även om det är sant att du kunde uppnå samma effekt före SQL Server 2017, var det lite krångligt.
Transact-SQL har nu STRING_AGG()
funktion, som sammanfogar värdena för stränguttryck och placerar separatorvärden mellan dem. Detta fungerar ungefär på samma sätt som MySQL:s GROUP_CONCAT()
funktion.
Den här artikeln ger exempel som visar T-SQL STRING_AGG()
funktion.
Exempeldata
Först, här är några exempeldata.
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
Exempel – kommaseparerad lista
Så vi kunde ta ovanstående data och använda STRING_AGG()
funktion för att lista alla uppgiftsnamn i en stor kommaseparerad lista.
Så här:
SELECT STRING_AGG(TaskName, ', ') FROM Tasks;
Resultat:
Feed cats, Water dog, Feed garden, Paint carpet, Clean roof, Feed cats
Naturligtvis behöver det inte nödvändigtvis separeras med ett kommatecken. Det kan separeras med valfritt uttryck av NVARCHAR
eller VARCHAR
typ, och det kan vara en bokstavlig eller en variabel.
Exempel – Kombinera kolumner
Vi kan också använda CONCAT()
funktion för att kombinera två fält tillsammans, åtskilda av sin egen avgränsare.
Exempel:
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
Exempel – Nullvärden
Om din resultatuppsättning innehåller nollvärden ignoreras dessa värden och en motsvarande avgränsare läggs inte till.
Om detta inte är lämpligt kan du ange ett värde för nullvärden genom att använda ISNULL()
funktion och skicka in det värde du vill använda när ett nullvärde påträffas. Genom att göra detta säkerställer du att du fortfarande får ett resultat när en rad innehåller ett nollvärde.
Tänk till exempel på följande fråga och resultatuppsättning:
SELECT TaskCode FROM Tasks;
Resultat:
TaskCode -------- cat123 null null pnt456 rof789 null
Vi kan se att det finns tre nollvärden inom resultatuppsättningen.
Om vi kör detta genom STRING_AGG()
funktion får vi detta:
SELECT STRING_AGG(TaskCode, ', ') FROM Tasks;
Resultat:
cat123, pnt456, rof789
Men om vi använder ISNULL()
funktion för att tillhandahålla en platshållare för eventuella nollvärden, får vi detta:
SELECT STRING_AGG(ISNULL(TaskCode, 'N/A'), ', ') FROM Tasks;
Resultat:
cat123, N/A, N/A, pnt456, rof789, N/A
Exempel – grupperade resultat
Du kan också använda STRING_AGG()
funktion när du grupperar din resultatuppsättning. Du kanske till exempel vill ha en lista över album grupperade efter artist.
För att demonstrera detta, föreställ dig en databas med två tabeller; Artists
och Albums
. Det finns ett ett till många förhållande mellan dessa tabeller. För varje artist kan det finnas många album.
Så en vanlig fråga som förenar båda tabellerna kan se ut ungefär så här:
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, om en artist har mer än ett album, listas artistens namn flera gånger – en gång för varje album.
Men vi kan använda STRING_AGG()
för att ändra detta så att vi listar varje artist bara en gång, följt av en kommaseparerad lista över album de har släppt:
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
Exempel – Beställning av resultaten
Du kan använda en ordningsklausul för att ordna resultaten inom den sammanlänkade gruppen. Detta görs med WITHIN GROUP
klausul. När du använder den här klausulen anger du beställningen med ORDER BY
följt av antingen ASC
(för stigande) eller DESC
(för fallande).
Exempel:
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