Jedną z funkcji T-SQL wprowadzonych w SQL Server 2017 jest STRING_AGG()
funkcjonować. Jest to w zasadzie odpowiednik funkcji GROUP_CONCAT()
w MySQL funkcja – pozwala zwracać wyniki zapytania w formie rozdzielanej listy, a nie w wierszach.
Istnieje jednak kilka drobnych różnic między tymi dwiema funkcjami.
W tym artykule omówiono niektóre z głównych różnic składniowych między tymi funkcjami.
Składnia
Po pierwsze, oto oficjalna składnia każdej funkcji.
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, separator ) [ <order_clause> ] <order_clause> ::= WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
Różnice składni
Oto trzy główne różnice w składni między GROUP_CONCAT()
MySQL i STRING_AGG()
w T-SQL funkcje:
- Domyślny separator :Prawdopodobnie najbardziej oczywistą różnicą jest fakt, że
STRING_AGG()
wymaga podania separatora. Jeśli nie podasz dwóch argumentów (drugi z nich jest separatorem), otrzymasz błąd. DziękiGROUP_CONCAT()
w MySQL z drugiej strony separator jest argumentem opcjonalnym. Jeśli go nie podasz, domyślnie użyje przecinka. - Porządkowanie wyników :Podczas gdy funkcje MySQL i T-SQL umożliwiają dodanie
ORDER BY
klauzula, składnia jest nieco inna. T-SQL wymaga użyciaWITHIN GROUP
klauzula podczas porządkowania zestawu wyników, podczas gdy MySQL nie ma tego wymagania. - Wyróżniające się wyniki :MySQL pozwala na użycie
DISTINCT
zwracać tylko unikalne wartości. T-SQL nie zapewnia tej opcji.
Poniżej znajdują się przykłady demonstrujące te różnice.
Domyślny separator
MySQL – GROUP_CONCAT()
Nie musimy określać separatora w MySQL. To jest argument opcjonalny. Domyślną wartością jest przecinek.
SELECT GROUP_CONCAT(Genre) AS Result FROM Genres;
Wynik:
+----------------------------------------------+ | Result | +----------------------------------------------+ | Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk | +----------------------------------------------+
T-SQL – STRING_AGG()
T-SQL wymaga od nas określenia separatora.
SELECT STRING_AGG(Genre, ',') AS Result FROM Genres;
Wynik:
Result -------------------------------------------- Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
Jeśli nie określimy separatora, otrzymamy błąd:
SELECT STRING_AGG(Genre) AS Result FROM Genres;
Wynik:
Error: The STRING_AGG function requires 2 argument(s).
Porządkowanie wyników
MySQL – GROUP_CONCAT()
Zamawiając zestaw wyników w MySQL, po prostu dodaj ORDER BY
klauzulę jako argument, po której następuje kolumna, według której ma być ona uporządkowana, po której następuje albo ASC
lub DESC
w zależności od tego, czy chcesz go w porządku rosnącym czy malejącym.
USE Music; SELECT ar.ArtistName AS 'Artist', GROUP_CONCAT(al.AlbumName ORDER BY al.AlbumName DESC) AS 'Album List' FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ArtistName;
Wynik:
+------------------------+----------------------------------------------------------------------------+ | Artist | Album List | +------------------------+----------------------------------------------------------------------------+ | AC/DC | Powerage | | 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 | Somewhere in Time,Powerslave,Piece of Mind,No Prayer for the Dying,Killers | | Jim Reeves | Singing Down the Lane | | Michael Learns to Rock | Scandinavia,Eternity,Blue Night | | The Script | No Sound Without Silence | | Tom Jones | Praise and Blame,Long Lost Suitcase,Along Came Jones | +------------------------+----------------------------------------------------------------------------+
T-SQL – STRING_AGG()
Przy zamawianiu połączonych wyników za pomocą ORDER BY
, SQL Server wymaga, aby element WITHIN GROUP
należy użyć klauzuli.
USE Music; SELECT ar.ArtistName AS 'Artist', STRING_AGG(al.AlbumName, ', ') WITHIN GROUP (ORDER BY al.AlbumName DESC) AS 'Album List' FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ArtistName;
Wynik:
Artist Album List ------------------------- ------------------------------------------------------------------------------ AC/DC Powerage 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 Somewhere in Time, Powerslave, Piece of Mind, No Prayer for the Dying, Killers Jim Reeves Singing Down the Lane Michael Learns to Rock Scandinavia, Eternity, Blue Night The Script No Sound Without Silence Tom Jones Praise and Blame, Long Lost Suitcase, Along Came Jones
Wyraźne wyniki
MySQL – GROUP_CONCAT()
GROUP_CONCAT()
w MySQL obsługuje DISTINCT
klauzula, która pozwala wyeliminować zduplikowane wartości z zestawu wyników.
USE Solutions; SELECT GROUP_CONCAT(DISTINCT TaskName) FROM Tasks;
Wynik:
+--------------------------------------------------------+ | GROUP_CONCAT(DISTINCT TaskName) | +--------------------------------------------------------+ | Do garden,Feed cats,Paint roof,Relax,Take dog for walk | +--------------------------------------------------------+
T-SQL – STRING_AGG()
STRING_AGG()
w T-SQL funkcja nie obsługuje DISTINCT
klauzula.
USE Solutions; SELECT STRING_AGG(DISTINCT TaskName, ',') FROM Tasks;
Wynik:
Error: Incorrect syntax near ','.
Zgodnie z oczekiwaniami, jeśli spróbujemy użyć DISTINCT
, wystąpi błąd klauzula z STRING_AGG()
.