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 |+---------+-----------------------+