Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL Group_Concat() vs T-SQL String_Agg()

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. Con GROUP_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 di WITHIN 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() .