sql >> Databasteknik >  >> RDS >> PostgreSQL

STRING_AGG() Funktion i PostgreSQL

I PostgreSQL kan vi använda STRING_AGG() funktion för att returnera kolumner från en fråga som en avgränsad lista.

Syntax

Syntaxen ser ut så här:

string_agg ( value text, delimiter text ) → text
string_agg ( value bytea, delimiter bytea ) → bytea

Vi kan också använda ORDER BY sats och en DISTINCT sats inifrån denna funktion, vilket påverkar utdata från funktionen. Mer om detta nedan.

Exempel

Anta att vi kör följande fråga:

SELECT PetName 
FROM Pets;

Och vi får följande resultat:

+---------+
| petname |
+---------+
| Fluffy  |
| Fetch   |
| Scratch |
| Wag     |
| Tweet   |
| Fluffy  |
| Bark    |
| Meow    |
+---------+
(8 rows)

Vi kan använda STRING_AGG() för att returnera alla dessa rader som en avgränsad lista.

För att göra detta, skicka PetName kolumn som första argument och vår valda avgränsare som andra argument:

SELECT STRING_AGG(PetName, ',') 
FROM Pets;

Resultat:

+-------------------------------------------------+
|                   string_agg                    |
+-------------------------------------------------+
| Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow |
+-------------------------------------------------+
(1 row)

Ändra avgränsaren

I föregående exempel valde jag ett kommatecken som avgränsare. Här är den med en annan avgränsare:

SELECT STRING_AGG(PetName, '-') 
FROM Pets;

Resultat:

Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Meow

Vi kan till och med använda en tom sträng för att ta bort alla avgränsare (så att värdena sammanfogas):

SELECT STRING_AGG(PetName, '') 
FROM Pets;

Och vi får följande resultat:

FluffyFetchScratchWagTweetFluffyBarkMeow

Beställer

Vi kan använda ORDER BY sats i STRING_AGG() funktion för att beställa sin egen utdata:

SELECT STRING_AGG(PetName, ',' ORDER BY PetName ASC) FROM Pets;

Resultat:

Bark,Fetch,Fluffy,Fluffy,Meow,Scratch,Tweet,Wag

Det var i stigande ordning.

Här är det i fallande ordning:

SELECT STRING_AGG(PetName, ',' ORDER BY PetName DESC) FROM Pets;

Resultat:

Wag,Tweet,Scratch,Meow,Fluffy,Fluffy,Fetch,Bark

Observera att detta bara sorterar utdata från STRING_AGG() funktion – den är helt oberoende av eventuell ordning som tillämpas på SELECT själva uttalandet.

DISTINCT Klausul

Vi kan använda DISTINCT klausul för att returnera unika värden. Med andra ord, om det finns dubbletter av värden, returneras endast en förekomst:

SELECT STRING_AGG(DISTINCT PetName, ',' ORDER BY PetName ASC) FROM Pets;

Resultat:

Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag

I det här fallet, Fluffy visas bara en gång. När vi kör det utan DISTINCT klausul, Fluffy visas två gånger:

SELECT STRING_AGG(PetName, ',' ORDER BY PetName ASC) FROM Pets;

Resultat:

Bark,Fetch,Fluffy,Fluffy,Meow,Scratch,Tweet,Wag

Grupperade frågeresultat

Vi kan inkludera STRING_AGG() i en fråga med en GROUP BY klausul för att uppnå ett resultat som detta:

SELECT 
    PetTypeId,
    STRING_AGG(PetName, ',' ORDER BY PetName ASC)
FROM Pets
GROUP BY PetTypeId
ORDER BY PetTypeId;

Resultat:

+-----------+-----------------------+
| pettypeid |      string_agg       |
+-----------+-----------------------+
|         1 | Tweet                 |
|         2 | Fluffy,Meow,Scratch   |
|         3 | Bark,Fetch,Fluffy,Wag |
+-----------+-----------------------+

I min databas finns de faktiska husdjurstypnamnen i en annan tabell som heter PetTypes . Vi kunde därför köra en INNER JOINPetTypes tabell för att få de faktiska husdjurstypnamnen:

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;

Resultat:

+---------+-----------------------+
| pettype |      string_agg       |
+---------+-----------------------+
| Bird    | Tweet                 |
| Cat     | Fluffy,Meow,Scratch   |
| Dog     | Bark,Fetch,Fluffy,Wag |
+---------+-----------------------+

  1. Konfigurera SQL-jobb i SQL Server med T-SQL

  2. Hur man beviljar alla privilegier på en databas i MySQL

  3. 10 effektiva sätt att bli mer produktiv på jobbet

  4. MySQL – Anslutningsfel – [MySQL][ODBC 5.3(w)-drivrutin] Värd 'IP' får inte ansluta till denna MySQL-server