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.