sql >> Databasteknik >  >> RDS >> Mysql

MySQL Group_Concat() vs T-SQL String_Agg()

En av T-SQL-funktionerna som introduceras i SQL Server 2017 är STRING_AGG() fungera. Detta är i princip motsvarigheten till MySQL:s GROUP_CONCAT() funktion – den låter dig returnera frågeresultat som en avgränsad lista, snarare än i rader.

Men det finns några mindre skillnader mellan de två funktionerna.

Den här artikeln utforskar några av de viktigaste syntaxskillnaderna mellan dessa funktioner.

Syntax

Först och främst, här är den officiella syntaxen för varje funktion.

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 ( uttryck, separator ) [  ] ::=INOM GRUPPEN (ORDER BY  [ ASC | DESC ] )

Syntaxskillnader

Här är de tre huvudsakliga syntaxskillnaderna mellan MySQL:s GROUP_CONCAT() och T-SQL:s STRING_AGG() funktioner:

  • Standardavgränsare :Den mest uppenbara skillnaden är förmodligen det faktum att STRING_AGG() kräver att du anger en separator. Om du inte anger två argument (av vilka det andra är avgränsaren) får du ett felmeddelande. Med MySQL:s GROUP_CONCAT() funktion å andra sidan är avgränsaren ett valfritt argument. Om du inte tillhandahåller det kommer det att använda kommatecken som standard.
  • Beställa resultaten :Medan både MySQL:s och T-SQL:s funktioner låter dig lägga till en ORDER BY sats är syntaxen något annorlunda. T-SQL kräver att du använder WITHIN GROUP klausul när du beställer resultatuppsättningen, medan MySQL inte har detta krav.
  • Särskilda resultat :MySQL låter dig använda DISTINCT för att endast returnera unika värden. T-SQL tillhandahåller inte detta alternativ.

Nedan finns exempel för att visa dessa skillnader.

Standardavgränsare

MySQL – GROUP_CONCAT()

Vi behöver inte ange separatorn i MySQL. Detta är ett valfritt argument. Standardvärdet är ett kommatecken.

VÄLJ GROUP_CONCAT(Genre) SOM ResultFROM genrer;

Resultat:

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

T-SQL – STRING_AGG()

T-SQL kräver att vi specificerar separatorn.

VÄLJ STRING_AGG(Genre, ',') SOM ResultFROM genrer;

Resultat:

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

Om vi ​​inte anger en separator får vi ett felmeddelande:

VÄLJ STRING_AGG(Genre) SOM ResultFROM genrer;

Resultat:

Fel:STRING_AGG-funktionen kräver två argument.

Beställa resultaten

MySQL – GROUP_CONCAT()

När du beställer resultatuppsättningen i MySQL, lägg helt enkelt till ORDER BY sats som ett argument, följt av kolumnen för att ordna den efter, följt av antingen ASC eller DESC beroende på om du vill ha den i stigande eller fallande ordning.

ANVÄND musik;VÄLJ ar.ArtistName SOM 'Artist', GROUP_CONCAT(al.AlbumName ORDER BY al.AlbumName DESC) SOM 'Album List'FROM Artists arINNER JOIN Album ALON ar.ArtistId =al.ArtistIdGROUP BY ArtistName; 

Resultat:

+------------------------+--------------------------- -------------------------------------------------- -----+| Konstnär | Albumlista |+------------------------+--------------------- -------------------------------------------------- -----+| AC/DC | Effekt || Allan Holdsworth | The Sexteen Men of Tain, All Night Wrong || Buddy Rich | Big Swing Face || Devin Townsend | Ziltoid den Allvetande,Epicloud,Casualtions of Cool || Iron Maiden | Somewhere in Time,Powerslave,Piece of Mind,Ingen bön för de döende,Mördare || Jim Reeves | Singing Down the Lane || Michael lär sig rocka | Skandinavien,Eternity,Blue Night || Manuset | Inget ljud utan tystnad || Tom Jones | Beröm och skuld,Lång förlorad resväska,Along Came Jones |+------------------------+------------------ -------------------------------------------------- --------------+

T-SQL – STRING_AGG()

När du beställer de sammanlänkade resultaten med ORDER BY ,  SQL Server kräver att WITHIN GROUP klausul användas.

ANVÄND musik;VÄLJ ar.ArtistName SOM 'Artist', STRING_AGG(al.AlbumName, ', ') INOM GRUPPEN (ORDER BY al.AlbumName DESC) SOM 'Album List'FRÅN Artister arINNER JOIN Album ALON ar.ArtistId =al.ArtistIdGROUP BY ArtistName;

Resultat:

Artistalbumlista -------------------------- -------------------------- -------------------------------------------------- ----------AC/DC Powerage Allan Holdsworth The Sixteen Men of Tain, All Night Wrong Buddy Rich Big Swing Face Devin Townsend Ziltoid the Allvetande, 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 

Distinkt resultat

MySQL – GROUP_CONCAT()

MySQL:s GROUP_CONCAT() stöder DISTINCT sats, som låter dig eliminera dubbletter av värden från resultatuppsättningen.

ANVÄND lösningar;VÄLJ GROUP_CONCAT(DISTINCT TaskName) FROM Tasks;

Resultat:

+------------------------------------------------------ ----------+| GROUP_CONCAT(DISTINCT TaskName) |+-------------------------------------------------------- -------------+| Gör trädgård, Mata katter, Måla taket, Slappna av, Ta hunden på promenad |+---------------------------------------- ----------------------------+

T-SQL – STRING_AGG()

T-SQL:s STRING_AGG() Funktionen stöder inte DISTINCT klausul.

ANVÄND lösningar;VÄLJ STRING_AGG(DISTINCT TaskName, ',') FROM Tasks;

Resultat:

Fel:Fel syntax nära ','.

Som förväntat uppstår ett fel om vi försöker använda DISTINCT sats med STRING_AGG() .


  1. Lista över datumformatspecifikationer i MySQL

  2. 2 sätt att få storleken på en databas i PostgreSQL

  3. PostgreSQL - max antal parametrar i IN-klausul?

  4. Använda MariaDB Flashback på en MySQL-server