Fra og med SQL Server 2017 kan du nu få dine forespørgselsresultater til at blive vist som en liste. Det betyder, at du kan få dit resultatsæt til at blive vist som en kommasepareret liste, en mellemrumssepareret liste eller hvilken som helst separator, du vælger at bruge.
Selvom det er rigtigt, at du kunne opnå den samme effekt før SQL Server 2017, var det en smule besværligt.
Transact-SQL har nu STRING_AGG()
funktion, som sammenkæder værdierne af strengudtryk og placerer separatorværdier mellem dem. Dette fungerer stort set på samme måde som MySQL's GROUP_CONCAT()
funktion.
Denne artikel giver eksempler, der demonstrerer T-SQL STRING_AGG()
funktion.
Eksempel på data
Først, her er nogle eksempeldata.
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
Eksempel – kommasepareret liste
Så vi kunne tage ovenstående data og bruge STRING_AGG()
funktion til at liste alle opgavenavnene i én stor kommasepareret liste.
Sådan:
SELECT STRING_AGG(TaskName, ', ') FROM Tasks;
Resultat:
Feed cats, Water dog, Feed garden, Paint carpet, Clean roof, Feed cats
Det behøver selvfølgelig ikke nødvendigvis at være adskilt med et komma. Det kan adskilles af ethvert udtryk for NVARCHAR
eller VARCHAR
type, og det kan være en bogstavelig eller en variabel.
Eksempel – Kombination af kolonner
Vi kunne også bruge CONCAT()
funktion til at kombinere to felter sammen, adskilt af deres egen separator.
Eksempel:
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
Eksempel – Null-værdier
Hvis dit resultatsæt indeholder nulværdier, ignoreres disse værdier, og der tilføjes ikke en tilsvarende separator.
Hvis dette ikke er egnet, kan du angive en værdi for null-værdier ved at bruge ISNULL()
funktion og indtastning af den værdi, du gerne vil bruge, hver gang der stødes på en nulværdi. Ved at gøre dette sikrer du, at du stadig får et resultat, når en række indeholder en nulværdi.
Overvej f.eks. følgende forespørgsel og resultatsæt:
SELECT TaskCode FROM Tasks;
Resultat:
TaskCode -------- cat123 null null pnt456 rof789 null
Vi kan se, at der er tre nulværdier i resultatsættet.
Hvis vi kører dette gennem STRING_AGG()
funktion, får vi dette:
SELECT STRING_AGG(TaskCode, ', ') FROM Tasks;
Resultat:
cat123, pnt456, rof789
Men hvis vi bruger ISNULL()
funktion til at give en pladsholder for alle null-værdier, får vi dette:
SELECT STRING_AGG(ISNULL(TaskCode, 'N/A'), ', ') FROM Tasks;
Resultat:
cat123, N/A, N/A, pnt456, rof789, N/A
Eksempel – grupperede resultater
Du kan også bruge STRING_AGG()
funktion, når du grupperer dit resultatsæt. For eksempel vil du måske have en liste over album grupperet efter kunstner.
For at demonstrere dette, forestil dig en database med to tabeller; Artists
og Albums
. Der er et til mange forhold mellem disse tabeller. For hver kunstner kan der være mange album.
Så en almindelig forespørgsel, der forbinder begge tabeller, kan se sådan ud:
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, hvis en kunstner har mere end ét album, vises kunstnerens navn flere gange – én gang for hvert album.
Men vi kan bruge STRING_AGG()
for at ændre dette, så vi kun viser hver kunstner én gang, efterfulgt af en kommasepareret liste over albums, de har udgivet:
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
Eksempel – Bestilling af resultaterne
Du kan bruge en rækkefølgeklausul til at sortere resultaterne inden for den sammenkædede gruppe. Dette gøres med WITHIN GROUP
klausul. Når du bruger denne klausul, angiver du rækkefølgen med ORDER BY
efterfulgt af enten ASC
(til stigende) eller DESC
(til faldende).
Eksempel:
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