Una delle funzioni T-SQL introdotte in SQL Server 2017 è STRING_AGG()
funzione. Questo è fondamentalmente l'equivalente di GROUP_CONCAT()
di MySQL funzione:ti consente di restituire i risultati della query come un elenco delimitato, anziché in righe.
Ma ci sono alcune piccole differenze tra le due funzioni.
Questo articolo esplora alcune delle principali differenze di sintassi tra queste funzioni.
Sintassi
Prima di tutto, ecco la sintassi ufficiale per ciascuna funzione.
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 ] )
Differenze sintattiche
Ecco le tre principali differenze di sintassi tra GROUP_CONCAT()
di MySQL e STRING_AGG()
di T-SQL funzioni:
- Separatore predefinito :Probabilmente la differenza più ovvia è il fatto che
STRING_AGG()
richiede di specificare un separatore. Se non fornisci due argomenti (il secondo dei quali è il separatore) riceverai un errore. ConGROUP_CONCAT()
di MySQL funzione d'altra parte, il separatore è un argomento opzionale. Se non lo fornisci, utilizzerà una virgola per impostazione predefinita. - Ordinare i risultati :Sebbene le funzioni di MySQL e T-SQL ti consentano di aggiungere un
ORDER BY
clausola, la sintassi è leggermente diversa. T-SQL richiede l'utilizzo diWITHIN GROUP
clausola quando si ordina il set di risultati, mentre MySQL non ha questo requisito. - Risultati distinti :MySQL ti permette di usare
DISTINCT
per restituire solo valori univoci. T-SQL non fornisce questa opzione.
Di seguito sono riportati esempi per dimostrare queste differenze.
Separatore predefinito
MySQL – GROUP_CONCAT()
Non è necessario specificare il separatore in MySQL. Questo è un argomento facoltativo. Il valore predefinito è una virgola.
SELECT GROUP_CONCAT(Genre) AS Result FROM Genres;
Risultato:
+----------------------------------------------+ | Result | +----------------------------------------------+ | Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk | +----------------------------------------------+
T-SQL – STRING_AGG()
T-SQL ci richiede di specificare il separatore.
SELECT STRING_AGG(Genre, ',') AS Result FROM Genres;
Risultato:
Result -------------------------------------------- Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
Se non specifichiamo un separatore otteniamo un errore:
SELECT STRING_AGG(Genre) AS Result FROM Genres;
Risultato:
Error: The STRING_AGG function requires 2 argument(s).
Ordinare i risultati
MySQL – GROUP_CONCAT()
Quando ordini il set di risultati in MySQL, aggiungi semplicemente il ORDER BY
clausola come argomento, seguita dalla colonna in base alla quale ordinarla, seguita da ASC
o DESC
a seconda che lo desideri in ordine crescente o decrescente.
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;
Risultato:
+------------------------+----------------------------------------------------------------------------+ | 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()
Quando si ordinano i risultati concatenati con ORDER BY
, SQL Server richiede che il WITHIN GROUP
clausola da utilizzare.
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;
Risultato:
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
Risultati distinti
MySQL – GROUP_CONCAT()
GROUP_CONCAT()
di MySQL supporta il DISTINCT
clausola, che consente di eliminare i valori duplicati dal set di risultati.
USE Solutions; SELECT GROUP_CONCAT(DISTINCT TaskName) FROM Tasks;
Risultato:
+--------------------------------------------------------+ | GROUP_CONCAT(DISTINCT TaskName) | +--------------------------------------------------------+ | Do garden,Feed cats,Paint roof,Relax,Take dog for walk | +--------------------------------------------------------+
T-SQL – STRING_AGG()
STRING_AGG()
di T-SQL la funzione non supporta il DISTINCT
clausola.
USE Solutions; SELECT STRING_AGG(DISTINCT TaskName, ',') FROM Tasks;
Risultato:
Error: Incorrect syntax near ','.
Come previsto, si verifica un errore se proviamo a utilizzare il DISTINCT
clausola con STRING_AGG()
.