Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL Group_Concat() vs T-SQL String_Agg()


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 o GROUP_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 o WITHIN 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 com ORDER BY , o SQL Server exige que o WITHIN 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 Jones 

Resultados distintos

MySQL – GROUP_CONCAT()


GROUP_CONCAT() do MySQL suporta o DISTINCT 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 o DISTINCT 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 o DISTINCT cláusula com STRING_AGG() .