L'une des fonctions T-SQL introduites dans SQL Server 2017 est le STRING_AGG()
une fonction. C'est fondamentalement l'équivalent du GROUP_CONCAT()
de MySQL fonction - elle vous permet de renvoyer les résultats de la requête sous forme de liste délimitée, plutôt que de lignes.
Mais il existe quelques différences mineures entre les deux fonctions.
Cet article explore certaines des principales différences de syntaxe entre ces fonctions.
Syntaxe
Tout d'abord, voici la syntaxe officielle de chaque fonction.
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, séparateur ) [] ::=WITHIN GROUP ( ORDER BY [ ASC | DESC ] )
Différences de syntaxe
Voici les trois principales différences de syntaxe entre le GROUP_CONCAT()
de MySQL et STRING_AGG()
de T-SQL fonctions :
- Séparateur par défaut :La différence la plus évidente est probablement le fait que
STRING_AGG()
vous oblige à spécifier un séparateur. Si vous ne fournissez pas deux arguments (dont le second est le séparateur), vous obtiendrez une erreur. Avec leGROUP_CONCAT()
de MySQL fonction d'autre part, le séparateur est un argument facultatif. Si vous ne le fournissez pas, il utilisera une virgule par défaut. - Ordre des résultats :Alors que les fonctions de MySQL et de T-SQL vous permettent d'ajouter un
ORDER BY
clause, la syntaxe est légèrement différente. T-SQL vous oblige à utiliser leWITHIN GROUP
lors de la commande du jeu de résultats, alors que MySQL n'a pas cette exigence. - Des résultats distincts :MySQL vous permet d'utiliser
DISTINCT
pour ne renvoyer que des valeurs uniques. T-SQL ne fournit pas cette option.
Vous trouverez ci-dessous des exemples pour illustrer ces différences.
Séparateur par défaut
MySQL – GROUP_CONCAT()
Nous n'avons pas besoin de spécifier le séparateur dans MySQL. Il s'agit d'un argument facultatif. La valeur par défaut est une virgule.
SELECT GROUP_CONCAT(Genre) AS ResultFROM Genres ;
Résultat :
+------------------------------------------------------------ +| Résultat |+------------------------------------------------------------+ | Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk |+--------------------------------------------- --------------+
T-SQL – STRING_AGG()
T-SQL nous demande de spécifier le séparateur.
SELECT STRING_AGG(Genre, ',') AS ResultFROM Genres ;
Résultat :
Résultat --------------------------------------------Rocher, Jazz, Country, Pop, Blues, Hip Hop, Rap, Punk
Si nous ne spécifions pas de séparateur, nous obtenons une erreur :
SELECT STRING_AGG(Genre) AS ResultFROM Genres ;
Résultat :
Erreur :La fonction STRING_AGG nécessite 2 argument(s).
Ordre des résultats
MySQL – GROUP_CONCAT()
Lors de la commande du jeu de résultats dans MySQL, ajoutez simplement le ORDER BY
clause comme argument, suivie de la colonne de classement, suivie soit de ASC
ou DESC
selon que vous le vouliez par ordre croissant ou décroissant.
USE Music ;SELECT ar.ArtistName AS 'Artist', GROUP_CONCAT(al.AlbumName ORDER BY al.AlbumName DESC) AS 'Album List'FROM Artists arINNER JOIN Albums alON ar.ArtistId =al.ArtistIdGROUP BY ArtistName ;Résultat :
+-----------------------+--------------------- -------------------------------------------------- -----+| Artiste | Liste d'albums |+-----------------------+--------------------- -------------------------------------------------- -----+| CA/CC | Alimentation || Allan Holdsworth | Les seize hommes de Tain, All Night Wrong || Copain riche | Grand visage de balançoire || Devin Townsend | Ziltoid l'Omniscient, Epicloud, Victimes de Cool || Vierge de Fer | Quelque part dans le temps, Powerslave, Morceau d'esprit, Pas de prière pour les mourants, Tueurs || Jim Reeves | Chanter sur la voie || Michael apprend à rocker | Scandinavie, Éternité, Nuit Bleue || Le Scénario | Pas de son sans silence || Tom Jones | Louange et blâme,Valise perdue depuis longtemps,Along Came Jones |+------------------------+------------ -------------------------------------------------- --------------+T-SQL – STRING_AGG()
Lors de la commande des résultats concaténés avec
ORDER BY
, SQL Server exige que leWITHIN GROUP
clause soit utilisée.USE Music ;SELECT ar.ArtistName AS 'Artist', STRING_AGG(al.AlbumName, ', ') WITHIN GROUP (ORDER BY al.AlbumName DESC) AS 'Album List'FROM Artists arINNER JOIN Albums alON ar.ArtistId =al.ArtistIdGROUP BY ArtistName ;Résultat :
Liste des albums d'artistes ------------------------- ------------------- -------------------------------------------------- ---------AC/DC Powerage Allan Holdsworth Les seize hommes de Tain, All Night Wrong Buddy Rich Big Swing Face Devin Townsend Ziltoid the Omniscient, Epicloud, Victimes 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 JonesDes résultats distincts
MySQL – GROUP_CONCAT()
GROUP_CONCAT()
de MySQL prend en charge leDISTINCT
clause, qui vous permet d'éliminer les valeurs en double du jeu de résultats.USE Solutions ;SELECT GROUP_CONCAT(DISTINCT TaskName) FROM Tâches ;Résultat :
+------------------------------------------------------------ ----------+| GROUP_CONCAT(DISTINCT TaskName) |+------------------------------------------------------- --------------+| Jardinez, Nourrissez les chats, Peignez le toit, Détendez-vous, Promenez votre chien |+--------------------------------------------- -----------------------+T-SQL – STRING_AGG()
STRING_AGG()
de T-SQL la fonction ne prend pas en charge leDISTINCT
clause.USE Solutions ;SELECT STRING_AGG(DISTINCT TaskName, ',') FROM Tasks ;Résultat :
Erreur :Syntaxe incorrecte près de ','.Comme prévu, une erreur se produit si nous essayons d'utiliser le
DISTINCT
clause avecSTRING_AGG()
.