Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL Group_Concat() vs. T-SQL String_Agg()

Eine der in SQL Server 2017 eingeführten T-SQL-Funktionen ist STRING_AGG() Funktion. Dies ist im Grunde das Äquivalent zu GROUP_CONCAT() von MySQL Funktion – Sie können Abfrageergebnisse als getrennte Liste statt in Zeilen zurückgeben.

Aber es gibt ein paar kleinere Unterschiede zwischen den beiden Funktionen.

Dieser Artikel untersucht einige der wichtigsten Syntaxunterschiede zwischen diesen Funktionen.

Syntax

Hier ist zunächst die offizielle Syntax für jede 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 ( expression, separator ) [  ] ::=WITHIN GROUP ( ORDER BY  [ ASC | DESC ] )

Syntaxunterschiede

Hier sind die drei wichtigsten Syntaxunterschiede zwischen GROUP_CONCAT() von MySQL und T-SQL STRING_AGG() Funktionen:

  • Standardtrennzeichen :Der wahrscheinlich offensichtlichste Unterschied ist die Tatsache, dass STRING_AGG() erfordert die Angabe eines Trennzeichens. Wenn Sie keine zwei Argumente angeben (das zweite ist das Trennzeichen), erhalten Sie eine Fehlermeldung. Mit GROUP_CONCAT() von MySQL Funktion hingegen ist das Trennzeichen ein optionales Argument. Wenn Sie es nicht angeben, wird standardmäßig ein Komma verwendet.
  • Ordnen der Ergebnisse :Sowohl die Funktionen von MySQL als auch die von T-SQL erlauben es Ihnen, einen ORDER BY hinzuzufügen -Klausel ist die Syntax etwas anders. T-SQL erfordert, dass Sie WITHIN GROUP verwenden -Klausel beim Ordnen der Ergebnismenge, wohingegen MySQL diese Anforderung nicht hat.
  • Eindeutige Ergebnisse :MySQL erlaubt die Verwendung von DISTINCT um nur eindeutige Werte zurückzugeben. T-SQL bietet diese Option nicht.

Nachfolgend finden Sie Beispiele, um diese Unterschiede zu demonstrieren.

Standardtrennzeichen

MySQL – GROUP_CONCAT()

Wir müssen das Trennzeichen in MySQL nicht angeben. Dies ist ein optionales Argument. Der Standardwert ist ein Komma.

SELECT GROUP_CONCAT(Genre) AS ResultFROM Genres;

Ergebnis:

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

T-SQL – STRING_AGG()

T-SQL erfordert, dass wir das Trennzeichen angeben.

SELECT STRING_AGG(Genre, ',') AS ResultFROM Genres;

Ergebnis:

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

Wenn wir kein Trennzeichen angeben, erhalten wir eine Fehlermeldung:

SELECT STRING_AGG(Genre) AS ResultFROM Genres;

Ergebnis:

Fehler:Die STRING_AGG-Funktion erfordert 2 Argumente.

Ordnen der Ergebnisse

MySQL – GROUP_CONCAT()

Fügen Sie beim Ordnen der Ergebnismenge in MySQL einfach den ORDER BY hinzu -Klausel als Argument, gefolgt von der Spalte, nach der sie sortiert werden soll, gefolgt von entweder ASC oder DESC je nachdem, ob Sie es in aufsteigender oder absteigender Reihenfolge wünschen.

USE Music;SELECT ar.ArtistName AS 'Artist', GROUP_CONCAT(al.AlbumName ORDER BY al.AlbumName DESC) AS 'Album List'FROM Artists arINNER JOIN Alben alON ar.ArtistId =al.ArtistIdGROUP BY ArtistName; 

Ergebnis:

+------------------------+--------------------- -------------------------------------------------- -----+| Künstler | Albumliste |+------------------------+--------------------- -------------------------------------------------- -----+| Wechselstrom/Gleichstrom | Machtzeit || Allan Holdsworth | Die sechzehn Männer von Tain, die ganze Nacht falsch || Kumpel Reich | Großes Schwinggesicht || Devin Townsend | Ziltoid der Allwissende,Epicloud,Opfer der Coolness || Eiserne Jungfrau | Irgendwo in der Zeit, Machtsklave, Stück Verstand, Kein Gebet für die Sterbenden, Killer || Jim Reeve | Auf der Straße singen || Michael lernt zu rocken | Skandinavien,Ewigkeit,Blaue Nacht || Das Skript | Kein Ton ohne Stille || Tom Jones | Lob und Tadel,Lang verlorener Koffer,Along Came Jones |+------------------------+------------ -------------------------------------------------- --------------+

T-SQL – STRING_AGG()

Beim Ordnen der verketteten Ergebnisse mit ORDER BY ,  SQL Server erfordert, dass WITHIN GROUP -Klausel verwendet werden.

USE Music;SELECT ar.ArtistName AS 'Artist', STRING_AGG(al.AlbumName, ', ') WITHIN GROUP (ORDER BY al.AlbumName DESC) AS 'Album List'FROM Artists arINNER JOIN Alben alON ar.ArtistId =al.ArtistIdGROUP BY ArtistName;

Ergebnis:

Künstler-Albumliste ------------------------- ------------------- -------------------------------------------------- ---------AC/DC Powerage Allan Holdsworth Die sechzehn Männer von Tain, die ganze Nacht falscher Kumpel Rich Big Swing Face Devin Townsend Ziltoid der Allwissende, Epicloud, Opfer der coolen Iron Maiden Irgendwo in der Zeit, 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 Lob und Tadel von Tom Jones, Long Lost Suitcase, Along Came Jones 

Eindeutige Ergebnisse

MySQL – GROUP_CONCAT()

GROUP_CONCAT() von MySQL unterstützt den DISTINCT -Klausel, mit der Sie doppelte Werte aus der Ergebnismenge entfernen können.

USE Solutions;SELECT GROUP_CONCAT(DISTINCT TaskName) FROM Tasks;

Ergebnis:

+---------------------------------------------- ----------+| GROUP_CONCAT(DISTINCT Aufgabenname) |+-------------------------------------------------------- -------------+| Gärtnern, Katzen füttern, Dach streichen, Entspannen, Hund Gassi gehen |+--------------------------------- -----------------------+

T-SQL – STRING_AGG()

STRING_AGG() von T-SQL Funktion unterstützt nicht den DISTINCT Klausel.

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

Ergebnis:

Fehler:Falsche Syntax in der Nähe von ','.

Wie erwartet tritt ein Fehler auf, wenn wir versuchen, den DISTINCT zu verwenden -Klausel mit STRING_AGG() .