I Oracle er LISTAGG()
funktion gør det muligt for os at kombinere data fra flere rækker til en enkelt række.
Vi har mulighed for at angive en separator (såsom et komma). Vi kan også bestille resultaterne produceret af LISTAGG()
funktion og mere.
Syntaks
Syntaksen ser sådan ud:
LISTAGG( [ ALL | DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
[ WITHIN GROUP order_by_clause ] [OVER query_partition_clause]
Hvor listagg_overflow_clause
er:
{ ON OVERFLOW ERROR }
|
{ ON OVERFLOW TRUNCATE [ 'truncation-indicator' ] [ { WITH | WITHOUT } COUNT ] }
Eksempel
Antag, at vi kører følgende forespørgsel:
SELECT region_name
FROM regions;
Resultat:
REGION_NAME _________________________ Europe Americas Asia Middle East and Africa
Vi kan bruge LISTAGG()
for at konvertere disse resultater til en kommasepareret liste:
SELECT LISTAGG(region_name, ', ')
FROM regions;
Resultat:
LISTAGG(REGION_NAME,',') _________________________________________________ Europe, Americas, Asia, Middle East and Africa
Skift separatoren
Vi kan ændre det andet argument til en anden separator:
SELECT LISTAGG(region_name, '; ')
FROM regions;
Resultat:
Europe; Americas; Asia; Middle East and Africa
Udlad separatoren
Vi kan udelade det andet argument for at få hver værdi sammenkædet uden en separator:
SELECT LISTAGG(region_name)
FROM regions;
Resultat:
EuropeAmericasAsiaMiddle East and Africa
Bestil resultaterne
Vi kan bruge koden WITHIN GROUP (ORDER BY...)
klausul for at bestille output fra LISTAGG()
funktion:
SELECT LISTAGG(region_name, ',') WITHIN GROUP (ORDER BY region_name ASC)
FROM regions;
Resultat:
Americas,Asia,Europe,Middle East and Africa
Brug i grupperede forespørgsler
Vi kan bruge LISTAGG()
funktion i en grupperet forespørgsel for at give resultater som dette:
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
Returnering kun distinkte værdier
Vi kan bruge DISTINCT
klausul for kun at returnere unikke værdier:
SELECT LISTAGG(DISTINCT region_id, ', ')
FROM regions;
Resultat:
1, 2, 3, 4
Se Oracles dokumentation for flere detaljer om, hvad du kan gøre med denne funktion.