sql >> Database teknologi >  >> RDS >> Oracle

LISTAGG() Funktion i Oracle

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.


  1. Hvordan finder man lignende resultater og sorterer efter lighed?

  2. Hvad er et simpelt kommandolinjeprogram eller script til backup af SQL-serverdatabaser?

  3. Best Practices for PostgreSQL-replikering - del 1

  4. Hvordan påvirker NULL-værdier ydeevnen i en databasesøgning?