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. MitGROUP_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 SieWITHIN 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:
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:
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()
.