Een van de T-SQL-functies die in SQL Server 2017 zijn geïntroduceerd, is de STRING_AGG()
functie. Dit is in feite het equivalent van MySQL's GROUP_CONCAT()
functie – hiermee kunt u zoekopdrachtresultaten retourneren als een lijst met scheidingstekens, in plaats van in rijen.
Maar er zijn een paar kleine verschillen tussen de twee functies.
Dit artikel onderzoekt enkele van de belangrijkste syntaxisverschillen tussen deze functies.
Syntaxis
Allereerst, hier is de officiële syntaxis voor elke functie.
MySQL – GROUP_CONCAT()
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
T-SQL – STRING_AGG()
STRING_AGG ( expression, separator ) [ <order_clause> ] <order_clause> ::= WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
Syntaxisverschillen
Dit zijn de drie belangrijkste syntaxisverschillen tussen GROUP_CONCAT()
van MySQL en T-SQL's STRING_AGG()
functies:
- Standaard scheidingsteken :Het meest voor de hand liggende verschil is waarschijnlijk het feit dat
STRING_AGG()
vereist dat u een scheidingsteken opgeeft. Als u geen twee argumenten opgeeft (waarvan de tweede het scheidingsteken is), krijgt u een foutmelding. Met MySQL'sGROUP_CONCAT()
functie aan de andere kant is het scheidingsteken een optioneel argument. Als je het niet opgeeft, zal het standaard een komma gebruiken. - De resultaten bestellen :Hoewel je met de functies van zowel MySQL als T-SQL een
ORDER BY
kunt toevoegen clausule, is de syntaxis iets anders. T-SQL vereist dat u deWITHIN GROUP
. gebruikt clausule bij het bestellen van de resultatenset, terwijl MySQL deze vereiste niet heeft. - Afzonderlijke resultaten :MySQL stelt u in staat om
DISTINCT
. te gebruiken om alleen unieke waarden te retourneren. T-SQL biedt deze optie niet.
Hieronder staan voorbeelden om deze verschillen te demonstreren.
Standaard scheidingsteken
MySQL – GROUP_CONCAT()
We hoeven het scheidingsteken niet op te geven in MySQL. Dit is een optioneel argument. De standaardwaarde is een komma.
SELECT GROUP_CONCAT(Genre) AS Result FROM Genres;
Resultaat:
+----------------------------------------------+ | Result | +----------------------------------------------+ | Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk | +----------------------------------------------+
T-SQL – STRING_AGG()
T-SQL vereist dat we het scheidingsteken specificeren.
SELECT STRING_AGG(Genre, ',') AS Result FROM Genres;
Resultaat:
Result -------------------------------------------- Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
Als we geen scheidingsteken opgeven, krijgen we een foutmelding:
SELECT STRING_AGG(Genre) AS Result FROM Genres;
Resultaat:
Error: The STRING_AGG function requires 2 argument(s).
De resultaten bestellen
MySQL – GROUP_CONCAT()
Wanneer u de resultatenset in MySQL bestelt, voegt u eenvoudig de ORDER BY
. toe clausule als een argument, gevolgd door de kolom om het te ordenen, gevolgd door ofwel ASC
of DESC
afhankelijk van of je het in oplopende of aflopende volgorde wilt.
USE Music; SELECT ar.ArtistName AS 'Artist', GROUP_CONCAT(al.AlbumName ORDER BY al.AlbumName DESC) AS 'Album List' FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ArtistName;
Resultaat:
+------------------------+----------------------------------------------------------------------------+ | Artist | Album List | +------------------------+----------------------------------------------------------------------------+ | 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 | +------------------------+----------------------------------------------------------------------------+
T-SQL – STRING_AGG()
Bij het bestellen van de aaneengeschakelde resultaten met ORDER BY
, SQL Server vereist dat de WITHIN GROUP
clausule worden gebruikt.
USE Music; SELECT ar.ArtistName AS 'Artist', STRING_AGG(al.AlbumName, ', ') WITHIN GROUP (ORDER BY al.AlbumName DESC) AS 'Album List' FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ArtistName;
Resultaat:
Artist Album List ------------------------- ------------------------------------------------------------------------------ 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
Afzonderlijke resultaten
MySQL – GROUP_CONCAT()
MySQL's GROUP_CONCAT()
ondersteunt de DISTINCT
clausule, waarmee u dubbele waarden uit de resultatenset kunt verwijderen.
USE Solutions; SELECT GROUP_CONCAT(DISTINCT TaskName) FROM Tasks;
Resultaat:
+--------------------------------------------------------+ | GROUP_CONCAT(DISTINCT TaskName) | +--------------------------------------------------------+ | Do garden,Feed cats,Paint roof,Relax,Take dog for walk | +--------------------------------------------------------+
T-SQL – STRING_AGG()
STRING_AGG()
. van T-SQL functie ondersteunt de DISTINCT
. niet clausule.
USE Solutions; SELECT STRING_AGG(DISTINCT TaskName, ',') FROM Tasks;
Resultaat:
Error: Incorrect syntax near ','.
Zoals verwacht, treedt er een fout op als we proberen de DISTINCT
. te gebruiken clausule met STRING_AGG()
.