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

Come utilizzare la funzione Oracle LISTAGG

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 correlati
Colonna 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