Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL Group_Concat() contre T-SQL String_Agg()

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 le GROUP_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 le WITHIN 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 le WITHIN 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 Jones 

Des résultats distincts

MySQL – GROUP_CONCAT()

GROUP_CONCAT() de MySQL prend en charge le DISTINCT 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 le DISTINCT 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 avec STRING_AGG() .