Oracle
 sql >> Datenbank >  >> RDS >> Oracle

LISTAGG()-Funktion in Oracle

In Oracle die LISTAGG() Funktion ermöglicht es uns, Daten aus mehreren Zeilen in einer einzigen Zeile zu kombinieren.

Wir haben die Möglichkeit, ein Trennzeichen (z. B. ein Komma) anzugeben. Wir können auch die von LISTAGG() erzeugten Ergebnisse bestellen Funktion und mehr.

Syntax

Die Syntax sieht so aus:

LISTAGG( [ ALL | DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
  [ WITHIN GROUP order_by_clause ] [OVER query_partition_clause]

Wobei listagg_overflow_clause ist:

{ ON OVERFLOW ERROR }
|
{ ON OVERFLOW TRUNCATE [ 'truncation-indicator' ] [ { WITH | WITHOUT } COUNT ] }

Beispiel

Angenommen, wir führen die folgende Abfrage aus:

SELECT region_name
FROM regions;

Ergebnis:

              REGION_NAME 
_________________________ 
Europe                    
Americas                  
Asia                      
Middle East and Africa    

Wir können LISTAGG() verwenden um diese Ergebnisse in eine kommagetrennte Liste umzuwandeln:

SELECT LISTAGG(region_name, ', ')
FROM regions;

Ergebnis:

                         LISTAGG(REGION_NAME,',') 
_________________________________________________ 
Europe, Americas, Asia, Middle East and Africa    

Trennzeichen ändern

Wir können das zweite Argument in ein anderes Trennzeichen ändern:

SELECT LISTAGG(region_name, '; ') 
FROM regions;

Ergebnis:

Europe; Americas; Asia; Middle East and Africa 

Lassen Sie das Trennzeichen weg

Wir können das zweite Argument weglassen, damit jeder Wert ohne Trennzeichen verkettet wird:

SELECT LISTAGG(region_name) 
FROM regions;

Ergebnis:

EuropeAmericasAsiaMiddle East and Africa

Ergebnisse anordnen

Wir können den WITHIN GROUP (ORDER BY...) verwenden -Klausel, um die Ausgabe von LISTAGG() zu ordnen Funktion:

SELECT LISTAGG(region_name, ',') WITHIN GROUP (ORDER BY region_name ASC) 
FROM regions;

Ergebnis:

Americas,Asia,Europe,Middle East and Africa

Verwendung in gruppierten Abfragen

Wir können die LISTAGG() verwenden Funktion innerhalb einer gruppierten Abfrage, um Ergebnisse wie diese bereitzustellen:

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;

Ergebnis:

   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           

Nur eindeutige Werte zurückgeben

Wir können den DISTINCT verwenden -Klausel, um nur eindeutige Werte zurückzugeben:

SELECT LISTAGG(DISTINCT region_id, ', ') 
FROM regions;

Ergebnis:

1, 2, 3, 4

Weitere Einzelheiten dazu, was Sie mit dieser Funktion tun können, finden Sie in der Oracle-Dokumentation.