Funzione Oracle LISTAGG è una funzione analitica che ci permette di concatenare le stringhe per measure_column per ogni GROUP in base alla order_by_clause. Questo è presente in Oracle da 11gR2
La sintassi per la funzione LISTAGG in Oracle è
LISTAGG (measure_column [, 'delimiter'])
CON IL GRUPPO (order_by_clause) [ OVER (query_partition_clause)]
Spiegazione dei termini
measure_column | La colonna o l'espressione di cui desideri concatenare i valori nel set di risultati. I valori Null in measure_column vengono ignorati. |
Delimitatore | Facoltativo. È il delimitatore da utilizzare quando si separa la measure_column valori durante l'output dei risultati. |
ordina_per_clausola | Determina l'ordine in cui vengono restituiti i valori concatenati |
Vediamo alcuni casi ed esempi sulla funzione LISTAGG
1) Come funzione aggregata a set singolo, LISTAGG opera su tutte le righe e restituisce una singola riga di output.
SELECT LISTAGG(first_name, '; ')
DENTRO IL GRUPPO (ORDINA PER data_assunzione, cognome) "Employee_list",
MIN(data_assunzione) "Prima"
DA emp
WHERE dept_no =30;
Elenco_impiegati Prima
-------------------------------------------- ---------------- ---------
TOM; BOB; FATTURA 17-JUN-18
2) Come aggregato di gruppo, la funzione opera e restituisce una riga di output per ogni gruppo definito dalla clausola GROUP BY.
COLUMN dipendenti FORMAT A50
SELECT reptno, LISTAGG(ename, ';') ALL'INTERNO DEL GRUPPO (ORDER BY ename) AS dipendenti
DALL'emp
GROUP BY deptno;
DEPTNO DIPENDENTI
---------- ----------------------------------- ---------------
10 JOSHUA,KING,MILLER
20 AJAY,FANES,SCOTT,SMITH
30 TOM; BOB; FATTURA
Altri esempi
seleziona nome_tabella,
listagg(nome_indice, ',') all'interno del gruppo (ordina per nome_indice) all_inds
da indici_utente
gruppo per nome_tabella;
3) Come funzione analitica, LISTAGG partiziona il set di risultati della query in gruppi basati su una o più espressioni nella query_partition_clause.
SQL> SELEZIONA reparto
, ename
, data di assunzione
, LISTAGG(ename, ',')
CON IL GRUPPO (ORDINA PER data di assunzione)
OVER (PARTIZIONE PER reparto) Dipendenti AS
DA emp order by deptno;
DEPTNO ENAME ASSUNTO DIPENDENTI
---------- ---------- ----------- ----------- --------------------------
10 JOSHUA 09/06/2018 JOSHUA,KING,MILLER
10 RE 17/ 11/2018 JOSHUA,KING,MILLER
10 MILLER 23/01/2018 JOSHUA,KING,MILLER
20 AJAY 17/12/2018 AJAY,FANES,SCOTT,SMITH
20 FANES 02/ 04/2018 AJAY,FANES,SCOTT,SMITH
20 SCOTT 19/04/2018 AJAY,FANES,SCOTT,SMITH
20 SMITH 23/05/2018 AJAY,FANES,SCOTT,SMITH
30 TOM 20/02/2018 TOM; BOB; FATTURA
30 BOB 22/02/2018 TOM; BOB; FATTURA
30 FATTURA 01/05/2018 TOM; BOB; FATTURA
Aggiunta nella funzione LISTAGG dal database Oracle 12cR2
Il numero massimo di caratteri restituiti è 4000 byte e se supera , dà l'errore
ORA-01489:il risultato della concatenazione di stringhe è troppo lungo
Con Oracle 12cR2 , Oracle ha fornito una clausola sul troncamento di overflow per gestire gli errori di overflow con garbo
listagg (
misura, ','
[ su overflow (tronca|errore) ]
[ testo ] [ (con|senza) conteggio ]
) all'interno del gruppo (ordina per cols )
Ora puoi dire esplicitamente se desideri la semantica di errore o di troncamento. I codici precedenti a 12cR2 funzionano correttamente poiché questo è il comportamento predefinito
Supponiamo ora di non voler restituire un errore quando attraversa 4k byte, quindi su overflow tronca è la soluzione.
select table_name,
listagg(index_name, ',' on overflow troncate) all'interno del gruppo (ordina per nome_indice) inds
da user_indexes
gruppo per nome_tabella;
Nel caso in cui si verifichi un troncamento, Oracle riporterà il troncamento al valore completo successivo, a quel punto potrai controllare come comunicare all'utente che l'elenco è stato troncato. Per impostazione predefinita, aggiungiamo tre punti "..." alla stringa come indicatore che si è verificato un troncamento. Puoi cambiare '….' se vuoi puoi sovrascriverlo
Se vuoi sostituire "..." con "altro", "extra" o un collegamento ipertestuale "fai clic per altro", fornisci semplicemente la tua nuova stringa!
select table_name,
listagg(index_name, ',' in overflow tronca
'|||'
) all'interno del gruppo (ordina per nome_indice) inds
da user_indexes
gruppo per nome_tabella;
Per impostazione predefinita, tronca mostra il conteggio dei valori mancanti Se non vuoi mostrare il conteggio, usa senza conteggio
seleziona nome_tabella,
listagg(nome_indice, ',' in overflow tronca '....' senza conteggio) all'interno del gruppo (ordina per nome_indice) inds
da indici_utente
gruppo per nome_tabella;
Soluzione precedente a 11GR2 (10g, 9i , 11gR1)
Se non stai eseguendo 11g Release 2 o versioni successive, ma stai eseguendo una versione del database in cui è presente la funzione WM_CONCAT, allora è una soluzione zero sforzo in quanto esegue l'aggregazione per te. In realtà è un esempio di una funzione aggregata definita dall'utente descritta di seguito, ma Oracle ha svolto tutto il lavoro per te.
COLUMN dipendenti FORMAT A50
SELECT reptno, wm_concat(ename) AS dipendenti
DALL'emp
GROUP BY reptno;
EPTNO EMPLOYEES
------ ---- ---------------------------------------------- ----
10 JOSHUA,KING,MILLER
20 AJAY,FANES,SCOTT,SMITH
30 TOM; BOB; FATTURA
Ciò può essere ottenuto anche tramite la funzione definita dall'utente. Consiglierei di controllare il seguente link asktom. Questo è da leggere
Opzione alternativa Listagg
Spero che il contenuto di questo post su Funzione Oracle LISTAGG ti piaccia
Articoli correlatiColonna di incremento automatico:sequenza come valore predefinito in Oracle e mysql
Oracle Joins
Sql Set Operators
Come utilizzare l'URL di Google Translate in Oracle plsql
Funzioni a riga singola in sql
funzione data in Oracle