Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O SQL Server Equivalente a GROUP_CONCAT()


Antes do surgimento do SQL Server 2017, não havia um equivalente T-SQL do MySQL GROUP_CONCAT() função. Essa função permite que você retorne um conjunto de resultados como uma lista separada por vírgulas, em vez de listar cada linha como uma linha separada (como em um conjunto de resultados normal).

Antes do SQL Server 2017, se você quisesse colocar seu resultado em uma lista separada por vírgulas, precisaria encontrar uma solução alternativa, talvez usando uma combinação de STUFF() , FOR XML e PATH() .

No entanto, o T-SQL agora tem o STRING_AGG() que está disponível no SQL Server 2017. Essa função faz praticamente a mesma coisa que o GROUP_CONCAT() do MySQL função (com algumas pequenas diferenças).


Sintaxe


A sintaxe do STRING_AGG() função fica assim:
STRING_AGG ( expression, separator ) [ <order_clause> ]

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

Onde expression é uma expressão de qualquer tipo. As expressões são convertidas em NVARCHAR ou VARCHAR tipos durante a concatenação. Os tipos sem string são convertidos em NVARCHAR tipo.

Em que separador é uma expressão de NVARCHAR ou VARCHAR tipo que é usado como separador para strings concatenadas. Pode ser literal ou variável.

A cláusula de pedido (opcional) consiste em WITHIN GROUP seguido por ORDER BY ASC ou ORDER BY DESC em parênteses. ASC ordena o resultado em ordem crescente. Este é o valor padrão. DESC ordena o resultado em ordem decrescente.

Exemplo


Aqui está um exemplo rápido do STRING_AGG() função:
SELECT STRING_AGG(Genre, ',') AS Result
FROM Genres;

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

Como você pode ver, o conjunto de resultados é listado como uma lista separada por vírgulas. Isso ocorre porque nosso segundo argumento é uma vírgula, que especifica que uma vírgula deve ser usada como separador.

Aqui está o mesmo conjunto de resultados, mas sem o STRING_AGG() função:
SELECT Genre AS Result 
FROM Genres;

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

Portanto, apenas um conjunto de resultados normal.

Para obter mais exemplos, como agrupar, manipular valores nulos e ordenar os resultados, consulte Como retornar resultados de consulta como uma lista separada por vírgulas no SQL Server.