En av T-SQL-funktionerna som introduceras i SQL Server 2017 är STRING_AGG()
fungera. Detta är i princip motsvarigheten till MySQL:s GROUP_CONCAT()
funktion – den låter dig returnera frågeresultat som en avgränsad lista, snarare än i rader.
Men det finns några mindre skillnader mellan de två funktionerna.
Den här artikeln utforskar några av de viktigaste syntaxskillnaderna mellan dessa funktioner.
Syntax
Först och främst, här är den officiella syntaxen för varje funktion.
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 ( uttryck, separator ) [] ::=INOM GRUPPEN (ORDER BY [ ASC | DESC ] )
Syntaxskillnader
Här är de tre huvudsakliga syntaxskillnaderna mellan MySQL:s GROUP_CONCAT()
och T-SQL:s STRING_AGG()
funktioner:
- Standardavgränsare :Den mest uppenbara skillnaden är förmodligen det faktum att
STRING_AGG()
kräver att du anger en separator. Om du inte anger två argument (av vilka det andra är avgränsaren) får du ett felmeddelande. Med MySQL:sGROUP_CONCAT()
funktion å andra sidan är avgränsaren ett valfritt argument. Om du inte tillhandahåller det kommer det att använda kommatecken som standard. - Beställa resultaten :Medan både MySQL:s och T-SQL:s funktioner låter dig lägga till en
ORDER BY
sats är syntaxen något annorlunda. T-SQL kräver att du använderWITHIN GROUP
klausul när du beställer resultatuppsättningen, medan MySQL inte har detta krav. - Särskilda resultat :MySQL låter dig använda
DISTINCT
för att endast returnera unika värden. T-SQL tillhandahåller inte detta alternativ.
Nedan finns exempel för att visa dessa skillnader.
Standardavgränsare
MySQL – GROUP_CONCAT()
Vi behöver inte ange separatorn i MySQL. Detta är ett valfritt argument. Standardvärdet är ett kommatecken.
VÄLJ GROUP_CONCAT(Genre) SOM ResultFROM genrer;
Resultat:
+------------------------------------------------------ +| Resultat |+-------------------------------------------------------------+ | Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk |+-------------------------------- --------------+
T-SQL – STRING_AGG()
T-SQL kräver att vi specificerar separatorn.
VÄLJ STRING_AGG(Genre, ',') SOM ResultFROM genrer;
Resultat:
Resultat --------------------------------------------- Rock, Jazz, Country, Pop, Blues, Hip Hop, Rap, Punk
Om vi inte anger en separator får vi ett felmeddelande:
VÄLJ STRING_AGG(Genre) SOM ResultFROM genrer;
Resultat:
Fel:STRING_AGG-funktionen kräver två argument.
Beställa resultaten
MySQL – GROUP_CONCAT()
När du beställer resultatuppsättningen i MySQL, lägg helt enkelt till ORDER BY
sats som ett argument, följt av kolumnen för att ordna den efter, följt av antingen ASC
eller DESC
beroende på om du vill ha den i stigande eller fallande ordning.
ANVÄND musik;VÄLJ ar.ArtistName SOM 'Artist', GROUP_CONCAT(al.AlbumName ORDER BY al.AlbumName DESC) SOM 'Album List'FROM Artists arINNER JOIN Album ALON ar.ArtistId =al.ArtistIdGROUP BY ArtistName;Resultat:
+------------------------+--------------------------- -------------------------------------------------- -----+| Konstnär | Albumlista |+------------------------+--------------------- -------------------------------------------------- -----+| AC/DC | Effekt || Allan Holdsworth | The Sexteen Men of Tain, All Night Wrong || Buddy Rich | Big Swing Face || Devin Townsend | Ziltoid den Allvetande,Epicloud,Casualtions of Cool || Iron Maiden | Somewhere in Time,Powerslave,Piece of Mind,Ingen bön för de döende,Mördare || Jim Reeves | Singing Down the Lane || Michael lär sig rocka | Skandinavien,Eternity,Blue Night || Manuset | Inget ljud utan tystnad || Tom Jones | Beröm och skuld,Lång förlorad resväska,Along Came Jones |+------------------------+------------------ -------------------------------------------------- --------------+T-SQL – STRING_AGG()
När du beställer de sammanlänkade resultaten med
ORDER BY
, SQL Server kräver attWITHIN GROUP
klausul användas.ANVÄND musik;VÄLJ ar.ArtistName SOM 'Artist', STRING_AGG(al.AlbumName, ', ') INOM GRUPPEN (ORDER BY al.AlbumName DESC) SOM 'Album List'FRÅN Artister arINNER JOIN Album ALON ar.ArtistId =al.ArtistIdGROUP BY ArtistName;Resultat:
Artistalbumlista -------------------------- -------------------------- -------------------------------------------------- ----------AC/DC Powerage Allan Holdsworth The Sixteen Men of Tain, All Night Wrong Buddy Rich Big Swing Face Devin Townsend Ziltoid the Allvetande, 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 JonesDistinkt resultat
MySQL – GROUP_CONCAT()
MySQL:s
GROUP_CONCAT()
stöderDISTINCT
sats, som låter dig eliminera dubbletter av värden från resultatuppsättningen.ANVÄND lösningar;VÄLJ GROUP_CONCAT(DISTINCT TaskName) FROM Tasks;Resultat:
+------------------------------------------------------ ----------+| GROUP_CONCAT(DISTINCT TaskName) |+-------------------------------------------------------- -------------+| Gör trädgård, Mata katter, Måla taket, Slappna av, Ta hunden på promenad |+---------------------------------------- ----------------------------+T-SQL – STRING_AGG()
T-SQL:s
STRING_AGG()
Funktionen stöder inteDISTINCT
klausul.ANVÄND lösningar;VÄLJ STRING_AGG(DISTINCT TaskName, ',') FROM Tasks;Resultat:
Fel:Fel syntax nära ','.Som förväntat uppstår ett fel om vi försöker använda
DISTINCT
sats medSTRING_AGG()
.