Jednou z funkcí T-SQL představených v SQL Server 2017 je STRING_AGG()
funkce. Toto je v podstatě ekvivalent GROUP_CONCAT()
MySQL funkce – umožňuje vracet výsledky dotazu jako seznam s oddělovači, nikoli v řádcích.
Mezi těmito dvěma funkcemi je však několik drobných rozdílů.
Tento článek zkoumá některé z hlavních rozdílů v syntaxi mezi těmito funkcemi.
Syntaxe
Za prvé, zde je oficiální syntaxe pro každou funkci.
MySQL – GROUP_CONCAT()
GROUP_CONCAT([DISTINCT] výraz [,výraz ...] [ORDER BY {unsigned_integer | col_name | výraz} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
T-SQL – STRING_AGG()
STRING_AGG ( výraz, oddělovač ) [] ::=WITHIN GROUP ( ORDER BY [ ASC | DESC ] )
Rozdíly v syntaxi
Zde jsou tři hlavní rozdíly v syntaxi mezi GROUP_CONCAT()
MySQL a STRING_AGG()
T-SQL funkce:
- Výchozí oddělovač :Pravděpodobně nejviditelnějším rozdílem je skutečnost, že
STRING_AGG()
vyžaduje zadání oddělovače. Pokud nezadáte dva argumenty (druhý z nich je oddělovač), dostanete chybu. SGROUP_CONCAT()
MySQL funkce na druhé straně, oddělovač je volitelný argument. Pokud jej nezadáte, použije se ve výchozím nastavení čárka. - Pořadí výsledků :Zatímco funkce MySQL i T-SQL umožňují přidat
ORDER BY
klauzule se syntaxe mírně liší. T-SQL vyžaduje, abyste použiliWITHIN GROUP
klauzule při objednávání sady výsledků, zatímco MySQL tento požadavek nemá. - Odlišné výsledky :MySQL vám umožňuje používat
DISTINCT
vrátit pouze jedinečné hodnoty. T-SQL tuto možnost neposkytuje.
Níže jsou uvedeny příklady, které tyto rozdíly demonstrují.
Výchozí oddělovač
MySQL – GROUP_CONCAT()
V MySQL nemusíme specifikovat oddělovač. Toto je volitelný argument. Výchozí hodnota je čárka.
SELECT GROUP_CONCAT(Genre) AS ResultFROM Genres;
Výsledek:
+---------------------------------------------- +| Výsledek |+----------------------------------------------+ | Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk |+--------------------------------- --------------+
T-SQL – STRING_AGG()
T-SQL vyžaduje, abychom specifikovali oddělovač.
SELECT STRING_AGG(Genre, ',') AS ResultFROM Genres;
Výsledek:
Výsledek -------------------------------------------- Rock, Jazz, Country, Pop, Blues, Hip Hop, Rap, Punk
Pokud neurčíme oddělovač, dostaneme chybu:
SELECT STRING_AGG(Genre) AS ResultFROM Genres;
Výsledek:
Chyba:Funkce STRING_AGG vyžaduje 2 argumenty.
Pořadí výsledků
MySQL – GROUP_CONCAT()
Při objednávání sady výsledků v MySQL jednoduše přidejte ORDER BY
klauzule jako argument, za kterou následuje sloupec, podle kterého se má řadit, následovaný buď ASC
nebo DESC
podle toho, zda jej chcete ve vzestupném nebo sestupném pořadí.
POUŽÍVEJTE hudbu;VYBERTE ar.ArtistName JAKO 'Artist', GROUP_CONCAT(al.AlbumName ORDER BY al.AlbumName DESC) JAKO 'Seznam alb'FROM Artists arINNER JOIN Alba alON ar.ArtistId =al.ArtistIdmeGROUP;Výsledek:
+------------------------+--------------------- -------------------------------------------------- -----+| Umělec | Seznam alb |+------------------------+---------------------- -------------------------------------------------- -----+| AC/DC | Výkon || 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 | Někde v čase,Pomocný otrok,Piece of Mind,No Modyer for the Dying,Killers || Jim Reeves | Singing Down the Lane || Michael se učí rockovat | Skandinávie,Věčnost,Modrá noc || Skript | Žádný zvuk bez ticha || Tom Jones | Chvála a vina,Dlouho ztracený kufr,Along Came Jones |+------------------------+------------ -------------------------------------------------- --------------+T-SQL – STRING_AGG()
Při řazení zřetězených výsledků pomocí
ORDER BY
, SQL Server vyžadujeWITHIN GROUP
použít klauzuli.POUŽÍVEJTE hudbu;VYBERTE ar.ArtistName JAKO 'Artist', STRING_AGG(al.AlbumName, ', ') WITHIN GROUP (ORDER BY al.AlbumName DESC) AS 'Album List'FROM Artists arINNER JOIN Alba alON =ar.ArtistId al.ArtistIdGROUP BY ArtistName;Výsledek:
Seznam alb interpretů ------------------------- ------------------- -------------------------------------------------- --------- Napájení AC/DC Allan Holdsworth Šestnáct mužů z Tainu, Celou noc Špatný Buddy Bohatý Velký Swing Face Devin Townsend Vševěd Ziltoid, Epicloud, Oběti Cool Iron Maiden Somewhere in Time, Powerslave, Piece of Mind, No Prayer for the Dying, KillersJim Reeves Zpívá Down the Lane Michael se učí rockovat Skandinávii, Eternity, Blue Night Scénář Žádný zvuk bez ticha e Tom Jones Chvála a vina, Dlouho ztracený kufr, Along Came JonesOdlišné výsledky
MySQL – GROUP_CONCAT()
GROUP_CONCAT()
MySQL podporujeDISTINCT
klauzule, která umožňuje odstranit duplicitní hodnoty ze sady výsledků.USE Solutions;SELECT GROUP_CONCAT(DISTINCT TaskName) FROM Tasks;Výsledek:
+---------------------------------------------- ----------+| GROUP_CONCAT(DISTINCT TaskName) |+------------------------------------------- -------------+| Dělat zahradu,Krmit kočky,Natírat střechu,Odpočívat,Vem psa na procházku |+--------------------------------- -----------------------+T-SQL – STRING_AGG()
STRING_AGG()
T-SQL funkce nepodporujeDISTINCT
doložka.USE Solutions;SELECT STRING_AGG(DISTINCT TaskName, ',') FROM Tasks;Výsledek:
Chyba:Nesprávná syntaxe poblíž ','.Podle očekávání dojde k chybě, pokud se pokusíme použít
DISTINCT
klauzule sSTRING_AGG()
.