sql >> Databasteknik >  >> RDS >> Oracle

LISTAGG() Funktion i Oracle

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.


  1. Installera SQL Server 2019 på en Mac

  2. Postgresql :Anslutningen nekades. Kontrollera att värdnamnet och porten är korrekta och att postmastern accepterar TCP/IP-anslutningar

  3. Hur väljer man rader som har dagens tidsstämpel?

  4. SQL count(*) prestanda