PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

STRING_AGG()-Funktion in PostgreSQL

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:

+---------------------------------------------- ---+| string_agg |+------------------------------------------------------------ --+| Flauschig, Apportieren, Kratzen, Wedeln, Twittern, Flauschig, Bellen, Miau |+-------------------------------- ----------------+(1 Zeile)

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