Některé RDBMS jako MySQL a MariaDB mají GROUP_CONCAT()
funkce, která umožňuje vrátit sloupec dotazu jako seznam s oddělovači (například seznam oddělený čárkami).
PostgreSQL má podobnou funkci s názvem STRING_AGG()
. Tato funkce funguje v podstatě stejným způsobem jako GROUP_CONCAT()
funguje v MySQL a MariaDB.
Příklad
Zde je základní příklad, který demonstruje, jak PostgreSQL STRING_AGG()
funkce funguje:
SELECT STRING_AGG(genre, ',') FROM Genres;
Výsledek:
Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
Co se stane, když provedeme dotaz bez STRING_AGG()
funkce:
SELECT genre FROM Genres;
Výsledek:
+---------+ | genre | +---------+ | Rock | | Jazz | | Country | | Pop | | Blues | | Hip Hop | | Rap | | Punk | +---------+ (8 rows)
Dostaneme osm řádků, každý se samostatnou hodnotou, namísto jednoho dlouhého řádku všech hodnot odděleného čárkou.
Pokud něco, tak STRING_AGG()
PostgreSQL je spíše jako GROUP_CONCAT()
MySQL než stejnojmenná funkce MariaDB. Říkám to proto, že GROUP_CONCAT()
MariaDB nám umožňuje poskytnout LIMIT
klauzule (od MariaDB 10.3.3), přímo ze samotné funkce. MySQL GROUP_CONCAT()
nepodporuje LIMIT
klauzule a ani STRING_AGG()
PostgreSQL funkce (alespoň ne v době psaní tohoto článku).
Dalším rozdílem je STRING_AGG()
PostgreSQL vyžaduje druhý argument (který určuje oddělovač, který se má použít). MySQL i MariaDB to činí volitelným pomocí jejich GROUP_CONCAT()
funkce.
STRING_AGG()
společnosti Postgres přijímá ORDER BY
klauzule a DISTINCT
klauzule (stejně jako GROUP_CONCAT()
MariaDB a MySQL funkce).
Viz STRING_AGG()
Funkce v PostgreSQL pro další příklady.
A v případě, že byste měli zájem, SQL Server má také STRING_AGG()
funkce, která funguje v podstatě stejným způsobem.