Uma das funções T-SQL introduzidas no SQL Server 2017 é o
STRING_AGG()
função. Isso é basicamente o equivalente ao GROUP_CONCAT()
do MySQL função – permite retornar os resultados da consulta como uma lista delimitada, em vez de em linhas. Mas existem algumas pequenas diferenças entre as duas funções.
Este artigo explora algumas das principais diferenças de sintaxe entre essas funções.
Sintaxe
Primeiro, aqui está a sintaxe oficial para cada função.
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 ( expressão, separador ) [] ::=WITHIN GROUP ( ORDER BY [ ASC | DESC ] )
Diferenças de sintaxe
Aqui estão as três principais diferenças de sintaxe entre o
GROUP_CONCAT()
do MySQL e T-SQL do STRING_AGG()
funções:- Separador padrão :provavelmente a diferença mais óbvia é o fato de que
STRING_AGG()
requer que você especifique um separador. Se você não fornecer dois argumentos (o segundo dos quais é o separador), receberá um erro. Com oGROUP_CONCAT()
do MySQL Por outro lado, o separador é um argumento opcional. Se você não fornecer, usará uma vírgula por padrão. - Ordenando os resultados :Enquanto as funções do MySQL e do T-SQL permitem que você adicione um
ORDER BY
cláusula, a sintaxe é ligeiramente diferente. T-SQL requer que você use oWITHIN GROUP
cláusula ao ordenar o conjunto de resultados, enquanto o MySQL não possui esse requisito. - Resultados distintos :MySQL permite que você use
DISTINCT
para retornar apenas valores exclusivos. O T-SQL não oferece essa opção.
Abaixo estão exemplos para demonstrar essas diferenças.
Separador padrão
MySQL – GROUP_CONCAT()
Não precisamos especificar o separador no MySQL. Este é um argumento opcional. O valor padrão é uma vírgula.
SELECT GROUP_CONCAT(Gênero) AS ResultFROM Gêneros;
Resultado:
+---------------------------------------------- +| Resultado |+---------------------------------------------+ | Rock, Jazz, Country, Pop, Blues, Hip Hop, Rap, Punk |+-------------------------------- --------------+
T-SQL – STRING_AGG()
O T-SQL exige que especifiquemos o separador.
SELECT STRING_AGG(Gênero, ',') AS ResultFROM Gêneros;
Resultado:
Resultado --------------------------------------------Rock, Jazz, Country, Pop, Blues, Hip Hop, Rap, Punk
Se não especificarmos um separador, obteremos um erro:
SELECT STRING_AGG(Gênero) AS ResultFROM Gêneros;
Resultado:
Erro:a função STRING_AGG requer 2 argumentos.
Ordenando os resultados
MySQL – GROUP_CONCAT()
Ao ordenar o conjunto de resultados no MySQL, basta adicionar o
ORDER BY
cláusula como um argumento, seguido pela coluna para ordená-lo, seguido por ASC
ou DESC
dependendo se você quer em ordem crescente ou decrescente. USE Music;SELECT ar.ArtistName AS 'Artist', GROUP_CONCAT(al.AlbumName ORDER BY al.AlbumName DESC) AS 'Album List'FROM Artistas arINNER JOIN Álbuns alON ar.ArtistId =al.ArtistIdGROUP BY ArtistName;
Resultado:
+------------------------+--------------------- -------------------------------------------------- -----+| Artista | Lista de álbuns |+------------------------+--------------------- -------------------------------------------------- -----+| CA/CC | Potência || Allan Holdsworth | Os Dezesseis Homens de Tain, A Noite Toda Errada || Amigo Rico | Grande cara de balanço || Devin Townsend | Ziltoid o Onisciente,Epicloud,Vítimas de Cool || Donzela de Ferro | Em algum lugar no tempo, Powerslave, Piece of Mind, Nenhuma Oração para os Moribundos, Assassinos || Jim Reeves | Cantando na Rua || Michael Aprende a Rock | Escandinávia, Eternidade, Noite Azul || O roteiro | Sem som sem silêncio || Tom Jones | Louvor e Culpa, Mala Perdida, Junto Came Jones |+------------------------+------------ -------------------------------------------------- --------------+T-SQL – STRING_AGG()
Ao ordenar os resultados concatenados comORDER BY
, o SQL Server exige que oWITHIN GROUP
cláusula ser utilizada.
USE Music;SELECT ar.ArtistName AS 'Artist', STRING_AGG(al.AlbumName, ', ') DENTRO DO GRUPO (ORDER BY al.AlbumName DESC) AS 'Album List'FROM Artists arINNER JOIN Álbuns alON ar.ArtistId =al.ArtistIdGROUP BY ArtistName;
Resultado:
Lista de álbuns do artista ------------------------- ------------------- -------------------------------------------------- ---------AC/DC Powerage Allan Holdsworth Os Dezesseis Homens de Tain, Toda a Noite Errado Amigo Rico Grande Cara de Balanço Devin Townsend Ziltoid, o Onisciente, Epicloud, Vítimas de Cool Iron Maiden Somewhere in Time, Powerslave, Piece of Mind, No Prayer for the Dying, KillersJim Reeves Singing Down the Lane Michael Aprende a Rock Escandinávia, Eternidade, Noite Azul O Script Sem Som Sem Silêncio e Tom Jones Louvor e Culpa, Long Lost Suitcase, Along Came JonesResultados distintos
MySQL – GROUP_CONCAT()
GROUP_CONCAT()
do MySQL suporta oDISTINCT
cláusula, que permite eliminar valores duplicados do conjunto de resultados.
USE Soluções;SELECT GROUP_CONCAT(DISTINCT TaskName) FROM Tarefas;
Resultado:
+---------------------------------------------- ----------+| GROUP_CONCAT(DISTINCT TaskName) |+---------------------------------------------------------- -------------+| Faça jardim, alimente gatos, pinte telhado, relaxe, leve cachorro para passear |+--------------------------------- -----------------------+T-SQL – STRING_AGG()
STRING_AGG()
do T-SQL função não suporta oDISTINCT
cláusula.
USE Solutions;SELECT STRING_AGG(DISTINCT TaskName, ',') FROM Tasks;
Resultado:
Erro:sintaxe incorreta perto de ','.
Como esperado, ocorre um erro se tentarmos usar oDISTINCT
cláusula comSTRING_AGG()
.