En af T-SQL-funktionerne introduceret i SQL Server 2017 er STRING_AGG()
fungere. Dette svarer grundlæggende til MySQL's GROUP_CONCAT()
funktion – den lader dig returnere forespørgselsresultater som en afgrænset liste i stedet for i rækker.
Men der er et par mindre forskelle mellem de to funktioner.
Denne artikel udforsker nogle af de vigtigste syntaksforskelle mellem disse funktioner.
Syntaks
Først og fremmest, her er den officielle syntaks for hver funktion.
MySQL – GROUP_CONCAT()
GROUP_CONCAT([DISTINCT] udtr [,udtr ...] [ORDER BY {usigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
T-SQL – STRING_AGG()
STRING_AGG ( udtryk, separator ) [] ::=INDEN FOR GRUPPE (ORDER BY [ ASC | DESC ] )
Syntaksforskelle
Her er de tre vigtigste syntaksforskelle mellem MySQLs GROUP_CONCAT()
og T-SQL's STRING_AGG()
funktioner:
- Standardseparator :Den mest åbenlyse forskel er nok det faktum, at
STRING_AGG()
kræver, at du angiver en separator. Hvis du ikke angiver to argumenter (hvoraf det andet er separatoren), får du en fejl. Med MySQL'sGROUP_CONCAT()
funktion på den anden side er separatoren et valgfrit argument. Hvis du ikke angiver det, vil det som standard bruge et komma. - Bestilling af resultaterne :Mens både MySQL's og T-SQL's funktioner giver dig mulighed for at tilføje en
ORDER BY
klausul, er syntaksen lidt anderledes. T-SQL kræver, at du brugerWITHIN GROUP
klausul ved bestilling af resultatsættet, hvorimod MySQL ikke har dette krav. - Særskilte resultater :MySQL giver dig mulighed for at bruge
DISTINCT
kun at returnere unikke værdier. T-SQL giver ikke denne mulighed.
Nedenfor er eksempler til at demonstrere disse forskelle.
Standardseparator
MySQL – GROUP_CONCAT()
Vi behøver ikke at angive separatoren i MySQL. Dette er et valgfrit argument. Standardværdien er et komma.
VÆLG GROUP_CONCAT(Genre) SOM RESULTATFRA genrer;
Resultat:
+---------------------------------------------- +| Resultat |+------------------------------------------------------+ | Rock, Jazz, Country, Pop, Blues, Hip Hop, Rap, Punk |+-------------------------------- --------------+
T-SQL – STRING_AGG()
T-SQL kræver, at vi angiver separatoren.
VÆLG STRING_AGG(Genre, ',') SOM RESULTATFRA genrer;
Resultat:
Resultat --------------------------------------------Rock, Jazz, Country, Pop, Blues, Hip Hop, Rap, Punk
Hvis vi ikke angiver en separator, får vi en fejlmeddelelse:
VÆLG STRING_AGG(Genre) SOM RESULTATFRA genrer;
Resultat:
Fejl:STRING_AGG-funktionen kræver 2 argument(er).
Bestilling af resultaterne
MySQL – GROUP_CONCAT()
Når du bestiller resultatsættet i MySQL, skal du blot tilføje ASC
eller DESC
alt efter om du vil have det i stigende eller faldende rækkefølge.
USE Music;SELECT ar.ArtistName AS 'Artist', GROUP_CONCAT(al.AlbumName ORDER BY al.AlbumName DESC) AS 'Album List'FRA kunstnere arINNER JOIN Albums ALON ar.ArtistId =al.ArtistIdGROUP BY ArtistName;Resultat:
+------------------------+--------------------- -------------------------------------------------- -----+| Kunstner | Albumliste |+------------------------+--------------------- -------------------------------------------------- -----+| AC/DC | Powerage || Allan Holdsworth | The Sixteen Men of Tain, All Night Wrong || Buddy Rich | Big Swing Face || Devin Townsend | Ziltoid den alvidende, Epicloud, Ofre for Cool || Iron Maiden | Somewhere in Time,Powerslave,Piece of Mind,Ingen bøn for de døende,Killere || Jim Reeves | Singing Down the Lane || Michael lærer at rocke | Skandinavien,Eternity,Blue Night || Scriptet | Ingen lyd uden stilhed || Tom Jones | Ros og skyld,Lang tabt kuffert,Along Came Jones |+------------------------+------------------ -------------------------------------------------- --------------+T-SQL – STRING_AGG()
Når du bestiller de sammenkædede resultater med
ORDER BY
, SQL Server kræver, atWITHIN GROUP
klausul bruges.BRUG Musik;VÆLG ar.ArtistName SOM 'Artist', STRING_AGG(al.AlbumName, ', ') INDEN FOR GRUPPE (ORDER BY al.AlbumName DESC) SOM 'Album List'FRA kunstnere arINNER JOIN Albums ALON ar.ArtistId =al.ArtistIdGROUP BY ArtistName;Resultat:
Liste over kunstneralbum -------------------------- -------------------------- -------------------------------------------------- ----------AC/DC Powerage Allan Holdsworth The Sixteen Men of Tain, All Night Wrong Buddy Rich Big Swing Face Devin Townsend Ziltoid the Alvidende, Epicloud, Casualties of Cool Iron Maiden Somewhere in Time, Powerslave, Piece of Mind, No Prayer for the Dying, KillersJim Reeves Singing Down the Lane Michael Learns to Rock Scandinavia, Eternity, Blue Night The Script No Sound Without Silenc e Tom Jones Praise and Blame, Long Lost Suitcase, Along Came JonesSærlige resultater
MySQL – GROUP_CONCAT()
MySQL's
GROUP_CONCAT()
understøtterDISTINCT
klausul, som giver dig mulighed for at fjerne duplikerede værdier fra resultatsættet.BRUG løsninger;SELECT GROUP_CONCAT(DISTINCT TaskName) FROM Tasks;Resultat:
+------------------------------------------------------ ----------+| GROUP_CONCAT(DISTINCT TaskName) |+-------------------------------------------------------- --------------+| Hav have, fodre katte, male tag, slappe af, tage hunden på tur |+---------------------------------------- ----------------------------+T-SQL – STRING_AGG()
T-SQL's
STRING_AGG()
funktionen understøtter ikkeDISTINCT
klausul.USE Solutions;SELECT STRING_AGG(DISTINCT TaskName, ',') FROM Tasks;Resultat:
Fejl:Forkert syntaks i nærheden af ','.Som forventet opstår der en fejl, hvis vi forsøger at bruge
DISTINCT
klausul medSTRING_AGG()
.