V PostgreSQL můžeme použít STRING_AGG()
funkce vrátit sloupce z dotazu jako seznam s oddělovači.
Syntaxe
Syntaxe vypadá takto:
string_agg ( value text, delimiter text ) → text
string_agg ( value bytea, delimiter bytea ) → bytea
Můžeme také použít ORDER BY
klauzule a DISTINCT
klauzule z této funkce, která ovlivňuje výstup z funkce. Více o tom níže.
Příklad
Předpokládejme, že spustíme následující dotaz:
SELECT PetName
FROM Pets;
A dostaneme následující výsledek:
+---------+ | petname | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ (8 rows)
Můžeme použít STRING_AGG()
vrátit všechny tyto řádky jako seznam s oddělovači.
Chcete-li to provést, předejte PetName
sloupec jako první argument a námi zvolený oddělovač jako druhý argument:
SELECT STRING_AGG(PetName, ',')
FROM Pets;
Výsledek:
+-------------------------------------------------+ | string_agg | +-------------------------------------------------+ | Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow | +-------------------------------------------------+ (1 row)
Změna oddělovače
V předchozím příkladu jsem jako oddělovač zvolil čárku. Tady je to s jiným oddělovačem:
SELECT STRING_AGG(PetName, '-')
FROM Pets;
Výsledek:
Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Meow
Můžeme dokonce použít prázdný řetězec k odstranění všech oddělovačů (takže hodnoty jsou zřetězené):
SELECT STRING_AGG(PetName, '')
FROM Pets;
A dostaneme následující výsledek:
FluffyFetchScratchWagTweetFluffyBarkMeow
Objednávání
Můžeme použít ORDER BY
klauzule v rámci STRING_AGG()
funkce pro objednání vlastního výstupu:
SELECT STRING_AGG(PetName, ',' ORDER BY PetName ASC) FROM Pets;
Výsledek:
Bark,Fetch,Fluffy,Fluffy,Meow,Scratch,Tweet,Wag
To bylo ve vzestupném pořadí.
Zde je to v sestupném pořadí:
SELECT STRING_AGG(PetName, ',' ORDER BY PetName DESC) FROM Pets;
Výsledek:
Wag,Tweet,Scratch,Meow,Fluffy,Fluffy,Fetch,Bark
Všimněte si, že toto třídí pouze výstup STRING_AGG()
funkce – je zcela nezávislá na jakémkoli řazení použitém na SELECT
samotné prohlášení.
DISTINCT
Ustanovení
Můžeme použít DISTINCT
klauzule pro vrácení jedinečných hodnot. Jinými slovy, pokud existují duplicitní hodnoty, je vrácen pouze jeden výskyt:
SELECT STRING_AGG(DISTINCT PetName, ',' ORDER BY PetName ASC) FROM Pets;
Výsledek:
Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag
V tomto případě Fluffy
se objeví pouze jednou. Když jej spustíme bez DISTINCT
klauzule, Fluffy
se objeví dvakrát:
SELECT STRING_AGG(PetName, ',' ORDER BY PetName ASC) FROM Pets;
Výsledek:
Bark,Fetch,Fluffy,Fluffy,Meow,Scratch,Tweet,Wag
Výsledky seskupených dotazů
Můžeme zahrnout STRING_AGG()
v dotazu s GROUP BY
klauzule k dosažení výsledku, jako je tento:
SELECT
PetTypeId,
STRING_AGG(PetName, ',' ORDER BY PetName ASC)
FROM Pets
GROUP BY PetTypeId
ORDER BY PetTypeId;
Výsledek:
+-----------+-----------------------+ | pettypeid | string_agg | +-----------+-----------------------+ | 1 | Tweet | | 2 | Fluffy,Meow,Scratch | | 3 | Bark,Fetch,Fluffy,Wag | +-----------+-----------------------+
V mé databázi jsou skutečná jména typů mazlíčků v jiné tabulce nazvané PetTypes
. Mohli bychom tedy spustit INNER JOIN
na PetTypes
tabulka pro získání skutečných jmen typu domácího mazlíčka:
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;
Výsledek:
+---------+-----------------------+ | pettype | string_agg | +---------+-----------------------+ | Bird | Tweet | | Cat | Fluffy,Meow,Scratch | | Dog | Bark,Fetch,Fluffy,Wag | +---------+-----------------------+