In PostgreSQL können wir den STRING_AGG()
verwenden Funktion, um Spalten aus einer Abfrage als eine begrenzte Liste zurückzugeben.
Syntax
Die Syntax lautet wie folgt:
string_agg ( value text, delimiter text ) → text
string_agg ( value bytea, delimiter bytea ) → bytea
Wir können auch den ORDER BY
verwenden -Klausel und ein DISTINCT
-Klausel innerhalb dieser Funktion, die sich auf die Ausgabe der Funktion auswirkt. Mehr dazu weiter unten.
Beispiel
Angenommen, wir führen die folgende Abfrage aus:
SELECT PetName
FROM Pets;
Und wir erhalten das folgende Ergebnis:
+---------+| Haustiername |+---------+| Flauschig || || holen Kratzer || Wag || Twittern || Flauschig || Rinde || Miau |+---------+(8 Reihen)
Wir können STRING_AGG()
verwenden alle diese Zeilen als Liste mit Trennzeichen zurückzugeben.
Übergeben Sie dazu den PetName
Spalte als erstes Argument und unser gewähltes Trennzeichen als zweites Argument:
SELECT STRING_AGG(PetName, ',')
FROM Pets;
Ergebnis:
Ändern des Trennzeichens
Im vorherigen Beispiel habe ich ein Komma als Trennzeichen gewählt. Hier ist es mit einem anderen Trennzeichen:
SELECT STRING_AGG(PetName, '-')
FROM Pets;
Ergebnis:
Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Miau
Wir können sogar einen leeren String verwenden, um alle Trennzeichen zu entfernen (damit die Werte verkettet werden):
SELECT STRING_AGG(PetName, '')
FROM Pets;
Und wir erhalten das folgende Ergebnis:
FluffyFetchScratchWagTweetFluffyBarkMeow
Bestellung
Wir können den ORDER BY
verwenden -Klausel innerhalb von STRING_AGG()
Funktion, um ihre eigene Ausgabe zu bestellen:
SELECT STRING_AGG(PetName, ',' ORDER BY PetName ASC) FROM Pets;
Ergebnis:
bellen, holen, flauschig, flauschig, miauen, kratzen, twittern, wedeln
Das war in aufsteigender Reihenfolge.
Hier in absteigender Reihenfolge:
SELECT STRING_AGG(PetName, ',' ORDER BY PetName DESC) FROM Pets;
Ergebnis:
Wedeln, twittern, kratzen, miauen, flauschig, flauschig, holen, bellen
Beachten Sie, dass dies nur die Ausgabe von STRING_AGG()
sortiert Funktion – sie ist völlig unabhängig von der Reihenfolge, die auf SELECT
angewendet wird Aussage selbst.
Der DISTINCT
Klausel
Wir können den DISTINCT
verwenden -Klausel, um eindeutige Werte zurückzugeben. Mit anderen Worten, wenn es doppelte Werte gibt, wird nur ein Vorkommen zurückgegeben:
SELECT STRING_AGG(DISTINCT PetName, ',' ORDER BY PetName ASC) FROM Pets;
Ergebnis:
bellen, holen, flauschig, miauen, kratzen, twittern, wedeln
In diesem Fall Fluffy
taucht nur einmal auf. Wenn wir es ohne DISTINCT
ausführen Klausel, Fluffy
erscheint zweimal:
SELECT STRING_AGG(PetName, ',' ORDER BY PetName ASC) FROM Pets;
Ergebnis:
bellen, holen, flauschig, flauschig, miauen, kratzen, twittern, wedeln
Gruppierte Abfrageergebnisse
Wir können STRING_AGG()
einfügen in einer Abfrage mit einem GROUP BY
-Klausel, um ein Ergebnis wie dieses zu erzielen:
SELECT
PetTypeId,
STRING_AGG(PetName, ',' ORDER BY PetName ASC)
FROM Pets
GROUP BY PetTypeId
ORDER BY PetTypeId;
Ergebnis:
+-----------+----------------------+| pettypeid | string_agg |+-----------+-------------------------------+| 1 | Twittern || 2 | Flauschig, miau, kratzen || 3 | Bellen,Fangen,Flauschig,Wedeln |+-----------+-----------------------+
In meiner Datenbank befinden sich die eigentlichen Haustiertypnamen in einer anderen Tabelle namens PetTypes
. Wir könnten daher einen INNER JOIN
ausführen auf den PetTypes
Tabelle, um die tatsächlichen Tiertypnamen zu erhalten:
SELECT
pt.PetType,
STRING_AGG(p.PetName, ',' ORDER BY p.PetName ASC)
FROM Pets p
INNER JOIN PetTypes pt ON
p.PetTypeId = pt.PetTypeId
GROUP BY pt.PetType
ORDER BY pt.PetType ASC;
Ergebnis:
+---------+----------------------+| Haustiertyp | string_agg |+---------+----------------------+| Vogel | Twittern || Katze | Flauschig, miau, kratzen || Hund | Bellen, Holen, Fluffig, Wedeln |+---------+-----------------------+