I Oracle, LISTAGG()
funktion gör det möjligt för oss att kombinera data från flera rader till en enda rad.
Vi har möjlighet att ange en avgränsare (som ett kommatecken). Vi kan också beställa resultaten som produceras av LISTAGG()
funktion och mer.
Syntax
Syntaxen ser ut så här:
LISTAGG( [ ALL | DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
[ WITHIN GROUP order_by_clause ] [OVER query_partition_clause]
Där listagg_overflow_clause
är:
{ ON OVERFLOW ERROR }
|
{ ON OVERFLOW TRUNCATE [ 'truncation-indicator' ] [ { WITH | WITHOUT } COUNT ] }
Exempel
Anta att vi kör följande fråga:
SELECT region_name
FROM regions;
Resultat:
REGION_NAME _________________________ Europe Americas Asia Middle East and Africa
Vi kan använda LISTAGG()
för att konvertera dessa resultat till en kommaseparerad lista:
SELECT LISTAGG(region_name, ', ')
FROM regions;
Resultat:
LISTAGG(REGION_NAME,',') _________________________________________________ Europe, Americas, Asia, Middle East and Africa
Ändra separator
Vi kan ändra det andra argumentet till en annan separator:
SELECT LISTAGG(region_name, '; ')
FROM regions;
Resultat:
Europe; Americas; Asia; Middle East and Africa
Uteslut avskiljaren
Vi kan utelämna det andra argumentet för att ha varje värde sammanlänkade utan en separator:
SELECT LISTAGG(region_name)
FROM regions;
Resultat:
EuropeAmericasAsiaMiddle East and Africa
Beställ resultaten
Vi kan använda koden WITHIN GROUP (ORDER BY...)
sats för att beställa utdata från LISTAGG()
funktion:
SELECT LISTAGG(region_name, ',') WITHIN GROUP (ORDER BY region_name ASC)
FROM regions;
Resultat:
Americas,Asia,Europe,Middle East and Africa
Användning i grupperade frågor
Vi kan använda LISTAGG()
funktion inom en grupperad fråga för att ge resultat som detta:
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;
Resultat:
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
Returnera endast distinkta värden
Vi kan använda DISTINCT
sats för att endast returnera unika värden:
SELECT LISTAGG(DISTINCT region_id, ', ')
FROM regions;
Resultat:
1, 2, 3, 4
Se Oracles dokumentation för mer information om vad du kan göra med den här funktionen.