V Oracle, LISTAGG()
Funkce nám umožňuje kombinovat data z více řádků do jednoho řádku.
Máme možnost určit oddělovač (například čárku). Můžeme také seřadit výsledky vytvořené pomocí LISTAGG()
funkce a další.
Syntaxe
Syntaxe vypadá takto:
LISTAGG( [ ALL | DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
[ WITHIN GROUP order_by_clause ] [OVER query_partition_clause]
Kde listagg_overflow_clause
je:
{ ON OVERFLOW ERROR }
|
{ ON OVERFLOW TRUNCATE [ 'truncation-indicator' ] [ { WITH | WITHOUT } COUNT ] }
Příklad
Předpokládejme, že spustíme následující dotaz:
SELECT region_name
FROM regions;
Výsledek:
REGION_NAME _________________________ Europe Americas Asia Middle East and Africa
Můžeme použít LISTAGG()
převést tyto výsledky na seznam oddělený čárkami:
SELECT LISTAGG(region_name, ', ')
FROM regions;
Výsledek:
LISTAGG(REGION_NAME,',') _________________________________________________ Europe, Americas, Asia, Middle East and Africa
Změňte oddělovač
Druhý argument můžeme změnit na jiný oddělovač:
SELECT LISTAGG(region_name, '; ')
FROM regions;
Výsledek:
Europe; Americas; Asia; Middle East and Africa
Vynechat oddělovač
Můžeme vynechat druhý argument, aby byla každá hodnota zřetězena bez oddělovače:
SELECT LISTAGG(region_name)
FROM regions;
Výsledek:
EuropeAmericasAsiaMiddle East and Africa
Objednejte si výsledky
Můžeme použít WITHIN GROUP (ORDER BY...)
klauzule k uspořádání výstupu LISTAGG()
funkce:
SELECT LISTAGG(region_name, ',') WITHIN GROUP (ORDER BY region_name ASC)
FROM regions;
Výsledek:
Americas,Asia,Europe,Middle East and Africa
Použití ve seskupených dotazech
Můžeme použít LISTAGG()
funkce v rámci seskupeného dotazu k poskytování výsledků jako je tento:
SELECT
region_id,
LISTAGG(country_id, ', ') WITHIN GROUP (ORDER BY country_id ASC) AS "Countries"
FROM countries
GROUP BY region_id
ORDER BY region_id;
Výsledek:
REGION_ID Countries ____________ _________________________________ 1 BE, CH, DE, DK, FR, IT, NL, UK 2 AR, BR, CA, MX, US 3 AU, CN, HK, IN, JP, SG 4 EG, IL, KW, NG, ZM, ZW
Vrátí pouze odlišné hodnoty
Můžeme použít DISTINCT
klauzule pro vrácení pouze jedinečných hodnot:
SELECT LISTAGG(DISTINCT region_id, ', ')
FROM regions;
Výsledek:
1, 2, 3, 4
Další podrobnosti o tom, co můžete s touto funkcí dělat, najdete v dokumentaci Oracle.