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

MySQL Group_Concat() vs T-SQL String_Agg()

En af T-SQL-funktionerne introduceret i SQL Server 2017 er STRING_AGG() fungere. Dette svarer grundlæggende til MySQL's GROUP_CONCAT() funktion – den lader dig returnere forespørgselsresultater som en afgrænset liste i stedet for i rækker.

Men der er et par mindre forskelle mellem de to funktioner.

Denne artikel udforsker nogle af de vigtigste syntaksforskelle mellem disse funktioner.

Syntaks

Først og fremmest, her er den officielle syntaks for hver funktion.

MySQL – GROUP_CONCAT()

GROUP_CONCAT([DISTINCT] udtr [,udtr ...] [ORDER BY {usigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])

T-SQL – STRING_AGG()

STRING_AGG ( udtryk, separator ) [  ] ::=INDEN FOR GRUPPE (ORDER BY  [ ASC | DESC ] )

Syntaksforskelle

Her er de tre vigtigste syntaksforskelle mellem MySQLs GROUP_CONCAT() og T-SQL's STRING_AGG() funktioner:

  • Standardseparator :Den mest åbenlyse forskel er nok det faktum, at STRING_AGG() kræver, at du angiver en separator. Hvis du ikke angiver to argumenter (hvoraf det andet er separatoren), får du en fejl. Med MySQL's GROUP_CONCAT() funktion på den anden side er separatoren et valgfrit argument. Hvis du ikke angiver det, vil det som standard bruge et komma.
  • Bestilling af resultaterne :Mens både MySQL's og T-SQL's funktioner giver dig mulighed for at tilføje en ORDER BY klausul, er syntaksen lidt anderledes. T-SQL kræver, at du bruger WITHIN GROUP klausul ved bestilling af resultatsættet, hvorimod MySQL ikke har dette krav.
  • Særskilte resultater :MySQL giver dig mulighed for at bruge DISTINCT kun at returnere unikke værdier. T-SQL giver ikke denne mulighed.

Nedenfor er eksempler til at demonstrere disse forskelle.

Standardseparator

MySQL – GROUP_CONCAT()

Vi behøver ikke at angive separatoren i MySQL. Dette er et valgfrit argument. Standardværdien er et komma.

VÆLG GROUP_CONCAT(Genre) SOM RESULTATFRA genrer;

Resultat:

+---------------------------------------------- +| Resultat |+------------------------------------------------------+ | Rock, Jazz, Country, Pop, Blues, Hip Hop, Rap, Punk |+-------------------------------- --------------+

T-SQL – STRING_AGG()

T-SQL kræver, at vi angiver separatoren.

VÆLG STRING_AGG(Genre, ',') SOM RESULTATFRA genrer;

Resultat:

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

Hvis vi ikke angiver en separator, får vi en fejlmeddelelse:

VÆLG STRING_AGG(Genre) SOM RESULTATFRA genrer;

Resultat:

Fejl:STRING_AGG-funktionen kræver 2 argument(er).

Bestilling af resultaterne

MySQL – GROUP_CONCAT()

Når du bestiller resultatsættet i MySQL, skal du blot tilføje ORDER BY klausul som et argument, efterfulgt af kolonnen for at sortere det efter, efterfulgt af enten ASC eller DESC alt efter om du vil have det i stigende eller faldende rækkefølge.

USE Music;SELECT ar.ArtistName AS 'Artist', GROUP_CONCAT(al.AlbumName ORDER BY al.AlbumName DESC) AS 'Album List'FRA kunstnere arINNER JOIN Albums ALON ar.ArtistId =al.ArtistIdGROUP BY ArtistName; 

Resultat:

+------------------------+--------------------- -------------------------------------------------- -----+| Kunstner | Albumliste |+------------------------+--------------------- -------------------------------------------------- -----+| AC/DC | Powerage || Allan Holdsworth | The Sixteen Men of Tain, All Night Wrong || Buddy Rich | Big Swing Face || Devin Townsend | Ziltoid den alvidende, Epicloud, Ofre for Cool || Iron Maiden | Somewhere in Time,Powerslave,Piece of Mind,Ingen bøn for de døende,Killere || Jim Reeves | Singing Down the Lane || Michael lærer at rocke | Skandinavien,Eternity,Blue Night || Scriptet | Ingen lyd uden stilhed || Tom Jones | Ros og skyld,Lang tabt kuffert,Along Came Jones |+------------------------+------------------ -------------------------------------------------- --------------+

T-SQL – STRING_AGG()

Når du bestiller de sammenkædede resultater med ORDER BY ,  SQL Server kræver, at WITHIN GROUP klausul bruges.

BRUG Musik;VÆLG ar.ArtistName SOM 'Artist', STRING_AGG(al.AlbumName, ', ') INDEN FOR GRUPPE (ORDER BY al.AlbumName DESC) SOM 'Album List'FRA kunstnere arINNER JOIN Albums ALON ar.ArtistId =al.ArtistIdGROUP BY ArtistName;

Resultat:

Liste over kunstneralbum -------------------------- -------------------------- -------------------------------------------------- ----------AC/DC Powerage Allan Holdsworth The Sixteen Men of Tain, All Night Wrong Buddy Rich Big Swing Face Devin Townsend Ziltoid the Alvidende, Epicloud, Casualties of Cool Iron Maiden Somewhere in Time, Powerslave, Piece of Mind, No Prayer for the Dying, KillersJim Reeves Singing Down the Lane Michael Learns to Rock Scandinavia, Eternity, Blue Night The Script No Sound Without Silenc e Tom Jones Praise and Blame, Long Lost Suitcase, Along Came Jones 

Særlige resultater

MySQL – GROUP_CONCAT()

MySQL's GROUP_CONCAT() understøtter DISTINCT klausul, som giver dig mulighed for at fjerne duplikerede værdier fra resultatsættet.

BRUG løsninger;SELECT GROUP_CONCAT(DISTINCT TaskName) FROM Tasks;

Resultat:

+------------------------------------------------------ ----------+| GROUP_CONCAT(DISTINCT TaskName) |+-------------------------------------------------------- --------------+| Hav have, fodre katte, male tag, slappe af, tage hunden på tur |+---------------------------------------- ----------------------------+

T-SQL – STRING_AGG()

T-SQL's STRING_AGG() funktionen understøtter ikke DISTINCT klausul.

USE Solutions;SELECT STRING_AGG(DISTINCT TaskName, ',') FROM Tasks;

Resultat:

Fejl:Forkert syntaks i nærheden af ​​','.

Som forventet opstår der en fejl, hvis vi forsøger at bruge DISTINCT klausul med STRING_AGG() .


  1. Sådan fungerer sqrt() i PostgreSQL

  2. Hvordan konverterer man alle tabeller fra MyISAM til InnoDB?

  3. Oprettelse af en datamodel for samkørsel

  4. rumfejl:De kolonner, der returneres af forespørgslen, har ikke felterne feltnavn