Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função LISTAGG() no Oracle


No Oracle, o LISTAGG() A função nos permite combinar dados de várias linhas em uma única linha.

Temos a opção de especificar um separador (como uma vírgula). Também podemos ordenar os resultados produzidos pelo LISTAGG() função e muito mais.

Sintaxe


A sintaxe fica assim:
LISTAGG( [ ALL | DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
  [ WITHIN GROUP order_by_clause ] [OVER query_partition_clause]

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

Exemplo


Suponha que executemos a seguinte consulta:
SELECT region_name
FROM regions;

Resultado:
              REGION_NAME 
_________________________ 
Europe                    
Americas                  
Asia                      
Middle East and Africa    

Podemos usar LISTAGG() para converter esses resultados em uma lista separada por vírgulas:
SELECT LISTAGG(region_name, ', ')
FROM regions;

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

Alterar o separador


Podemos alterar o segundo argumento para um separador diferente:
SELECT LISTAGG(region_name, '; ') 
FROM regions;

Resultado:
Europe; Americas; Asia; Middle East and Africa 

Omitir o separador


Podemos omitir o segundo argumento para ter cada valor concatenado sem um separador:
SELECT LISTAGG(region_name) 
FROM regions;

Resultado:
EuropeAmericasAsiaMiddle East and Africa

Ordenar os resultados


Podemos usar o WITHIN GROUP (ORDER BY...) cláusula para ordenar a saída do LISTAGG() função:
SELECT LISTAGG(region_name, ',') WITHIN GROUP (ORDER BY region_name ASC) 
FROM regions;

Resultado:
Americas,Asia,Europe,Middle East and Africa

Uso em consultas agrupadas


Podemos usar o LISTAGG() função dentro de uma consulta agrupada para fornecer resultados como este:
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;

Resultado:
   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           

Retornar apenas valores distintos


Podemos usar o DISTINCT cláusula para retornar apenas valores exclusivos:
SELECT LISTAGG(DISTINCT region_id, ', ') 
FROM regions;

Resultado:
1, 2, 3, 4

Consulte a documentação da Oracle para obter mais detalhes sobre o que você pode fazer com essa função.