Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server equivalente a GROUP_CONCAT()

Prima dell'arrivo di SQL Server 2017, non esisteva un equivalente T-SQL di MySQL GROUP_CONCAT() funzione. Questa funzione ti consente di restituire un set di risultati come un elenco separato da virgole, invece di elencare ogni riga come una riga separata (come con un normale set di risultati).

Prima di SQL Server 2017, se si desidera inserire il risultato in un elenco separato da virgole, è necessario trovare una soluzione alternativa, magari utilizzando una combinazione di STUFF() , FOR XML e PATH() .

Tuttavia, T-SQL ora ha il STRING_AGG() funzione disponibile da SQL Server 2017. Questa funzione fa praticamente la stessa cosa di GROUP_CONCAT() di MySQL funzione (con alcune piccole differenze).

Sintassi

La sintassi di STRING_AGG() la funzione va così:

STRING_AGG ( expression, separator ) [ <order_clause> ]

<order_clause> ::=   
    WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )

Dove expression è un'espressione di qualsiasi tipo. Le espressioni vengono convertite in NVARCHARVARCHAR tipi durante la concatenazione. I tipi non stringa vengono convertiti in NVARCHAR digitare.

Dove separatore è un'espressione di NVARCHARVARCHAR tipo utilizzato come separatore per le stringhe concatenate. Può essere letterale o variabile.

La clausola d'ordine (facoltativa) è composta da WITHIN GROUP seguito da ORDER BY ASC o ORDER BY DESC tra parentesi. ASC ordina il risultato in ordine crescente. Questo è il valore predefinito. DESC ordina il risultato in ordine decrescente.

Esempio

Ecco un rapido esempio di STRING_AGG() funzione:

SELECT STRING_AGG(Genre, ',') AS Result
FROM Genres;

Risultato:

Result                                      
--------------------------------------------
Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk

Come puoi vedere, il set di risultati è elencato come un elenco separato da virgole. Questo perché il nostro secondo argomento è una virgola, che specifica che una virgola deve essere utilizzata come separatore.

Ecco lo stesso set di risultati ma senza STRING_AGG() funzione:

SELECT Genre AS Result 
FROM Genres;

Risultato:

Result 
-------
Rock   
Jazz   
Country
Pop    
Blues  
Hip Hop
Rap    
Punk   

Quindi solo un normale set di risultati.

Per altri esempi, come il raggruppamento, la gestione dei valori Null e l'ordinamento dei risultati, vedere Come restituire i risultati delle query come un elenco separato da virgole in SQL Server.