sql >> Databáze >  >> RDS >> Oracle

Funkce LISTAGG() v Oracle

V Oracle, LISTAGG() Funkce nám umožňuje kombinovat data z více řádků do jednoho řádku.

Máme možnost určit oddělovač (například čárku). Můžeme také seřadit výsledky vytvořené pomocí LISTAGG() funkce a další.

Syntaxe

Syntaxe vypadá takto:

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

Kde listagg_overflow_clause je:

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

Příklad

Předpokládejme, že spustíme následující dotaz:

SELECT region_name
FROM regions;

Výsledek:

              REGION_NAME 
_________________________ 
Europe                    
Americas                  
Asia                      
Middle East and Africa    

Můžeme použít LISTAGG() převést tyto výsledky na seznam oddělený čárkami:

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

Výsledek:

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

Změňte oddělovač

Druhý argument můžeme změnit na jiný oddělovač:

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

Výsledek:

Europe; Americas; Asia; Middle East and Africa 

Vynechat oddělovač

Můžeme vynechat druhý argument, aby byla každá hodnota zřetězena bez oddělovače:

SELECT LISTAGG(region_name) 
FROM regions;

Výsledek:

EuropeAmericasAsiaMiddle East and Africa

Objednejte si výsledky

Můžeme použít WITHIN GROUP (ORDER BY...) klauzule k uspořádání výstupu LISTAGG() funkce:

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

Výsledek:

Americas,Asia,Europe,Middle East and Africa

Použití ve seskupených dotazech

Můžeme použít LISTAGG() funkce v rámci seskupeného dotazu k poskytování výsledků jako je tento:

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;

Výsledek:

   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           

Vrátí pouze odlišné hodnoty

Můžeme použít DISTINCT klauzule pro vrácení pouze jedinečných hodnot:

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

Výsledek:

1, 2, 3, 4

Další podrobnosti o tom, co můžete s touto funkcí dělat, najdete v dokumentaci Oracle.


  1. Úvod do databází časových řad

  2. Funkce LOWER() v Oracle

  3. Základní příkazy SQL:Jak psát jednoduché dotazy s příklady

  4. Je mysqli_real_escape_string dostačující, aby se zabránilo SQL injection nebo jiným SQL útokům?