sql >> Databáze >  >> RDS >> PostgreSQL

Funkce STRING_AGG() v PostgreSQL

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

  1. Jak zašifrovat uloženou proceduru na serveru SQL Server

  2. Tabulka se souřadnicemi šestihranné sítě, která pokrývá svět

  3. Jak načíst počet řádků pro všechny tabulky v databázi SQL SERVER

  4. SQL Server SELECT, kde jakýkoli sloupec obsahuje 'x'