Funkcja Oracle LITAGG to funkcja analityczna, która pozwala nam łączyć ciągi dla kolumny miary dla każdej GRUPY na podstawie klauzuli order_by_clause. Jest to obecne w Oracle od 11gR2
Składnia funkcji LISTAGG w Oracle to
LISTAGG (measure_column [, 'delimiter'])
WITHIN GROUP (order_by_clause) [OVER (query_partition_clause)]
Wyjaśnienie terminów
miara_kolumny | Kolumna lub wyrażenie, których wartości chcesz połączyć w zestawie wyników. Wartości null w kolumnie miary są ignorowane. |
Ogranicznik | Opcjonalne. Jest separatorem używanym przy oddzielaniu kolumny_miara wartości podczas wyprowadzania wyników. |
order_by_clause | Określa kolejność, w jakiej połączone wartości są zwracane |
Zobaczmy kilka przypadków i przykład funkcji LISTAGG
1) Jako funkcja agregująca pojedynczego zestawu, LISTAGG działa na wszystkich wierszach i zwraca jeden wiersz wyjściowy.
SELECT LISTAGG(first_name, '; ')
WITHIN GROUP (ORDER BY hire_date, last_name) "Employee_list",
MIN(hire_date) "Earliest"
FROM emp
WHERE dept_no = 30;Employee_list Earliest
------------------------------------------------------------ ---------
TOM; BOB; BILL 17-JUN-18
2) Jako agregacja zestawu grupowego, funkcja działa na i zwraca wiersz wyjściowy dla każdej grupy zdefiniowanej w klauzuli GROUP BY.
COLUMN employees FORMAT A50
SELECT deptno, LISTAGG(ename, ';') WITHIN GROUP (ORDER BY ename) AS employees
FROM emp
GROUP BY deptno;
DEPTNO EMPLOYEES
---------- --------------------------------------------------
10 JOSHUA,KING,MILLER
20 AJAY,FANES,SCOTT,SMITH
30 TOM; BOB; BILLMore Example
select table_name,
listagg(index_name, ',') within group (order by index_name) all_inds
from user_indexes
group by table_name;
3)Jako funkcja analityczna LITAGG dzieli zestaw wyników zapytania na grupy na podstawie co najmniej jednego wyrażenia w klauzuli query_partition_clause.
SQL> SELECT deptno
, ename
, hiredate
, LISTAGG(ename, ',')
WITHIN GROUP (ORDER BY hiredate)
OVER (PARTITION BY deptno) AS employees
FROM emp order by deptno;DEPTNO ENAME HIREDATE EMPLOYEES
---------- ---------- ----------- -------------------------------------
10 JOSHUA 09/06/2018 JOSHUA,KING,MILLER
10 KING 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; BILL
30 BOB 22/02/2018 TOM; BOB; BILL
30 BILL 01/05/2018 TOM; BOB; BILL
Dodanie w funkcji LITAGG z bazy danych Oracle 12cR2
Maksymalna liczba zwracanych znaków to 4000 bajtów, a jeśli przekroczy , pojawia się błąd
ORA-01489:wynik konkatenacji ciągów jest za długi
W Oracle 12cR2 firma Oracle zapewniła klauzulę dotyczącą obcinania przepełnienia, aby z wdziękiem poradzić sobie z błędami przepełnienia
listagg (
measure, ','
[ on overflow (truncate|error) ]
[ text ] [ (with|without) count ]
) within group (order by cols)
Teraz możesz wyraźnie określić, czy chcesz semantykę błędu, czy obcięcia. Kody przed 12cR2 działają dobrze, ponieważ jest to zachowanie domyślne
Załóżmy teraz, że nie chcesz zwracać błędu, gdy przekroczy on 4k bajtów, a następnie po obcięciu przepełnienia jest rozwiązaniem.
select table_name,
listagg(index_name, ',' on overflow truncate) within group (order by index_name) inds
from user_indexes
group by table_name;
Jeśli nastąpi obcięcie, Oracle skróci z powrotem do następnej pełnej wartości, w którym możesz kontrolować sposób informowania użytkownika, że lista została obcięta. Domyślnie dołączamy do ciągu trzy kropki „…” jako wskaźnik, że nastąpiło obcięcie. Możesz zmienić „….”, jeśli chcesz, możesz to zmienić
Jeśli chcesz zastąpić „…” hiperłączem „więcej”, „dodatkowo” lub „kliknij, aby uzyskać więcej”, po prostu podaj nowy ciąg!
select table_name,
listagg(index_name, ',' on overflow truncate
'|||'
) within group (order by index_name) inds
from user_indexes
group by table_name;
Domyślnie obcinanie pokazuje liczbę brakujących wartości Jeśli nie chcesz pokazywać liczby, użyj bez liczenia
select table_name,
listagg(index_name, ',' on overflow truncate '....' without count) within group (order by index_name) inds
from user_indexes
group by table_name;
Roztwór przed 11GR2 (10g, 9i, 11gR1)
Jeśli nie korzystasz z wersji 11g w wersji 2 lub nowszej, ale używasz wersji bazy danych, w której występuje funkcja WM_CONCAT, jest to rozwiązanie bez nakładu pracy, ponieważ wykonuje agregację za Ciebie. W rzeczywistości jest to przykład zdefiniowanej przez użytkownika funkcji agregującej opisanej poniżej, ale Oracle wykonało całą pracę za Ciebie.
COLUMN employees FORMAT A50
SELECT deptno, wm_concat(ename) AS employees
FROM emp
GROUP BY deptno;
EPTNO EMPLOYEES
---------- --------------------------------------------------
10 JOSHUA,KING,MILLER
20 AJAY,FANES,SCOTT,SMITH
30 TOM; BOB; BILL
Można to również osiągnąć za pomocą funkcji zdefiniowanej przez użytkownika. Polecam sprawdzić poniższy link asktom. To trzeba przeczytać
Alternatywna opcja Listagg
Mam nadzieję, że podoba Ci się treść tego posta na temat funkcji Oracle LITAGG
Powiązane artykułyKolumna autoinkrementacji – sekwencja jako wartość domyślna w Oracle i mysql
Oracle Joins
Operatory zestawów SQL
Jak używać adresu URL google translate w Oracle plsql
Funkcje pojedynczego wiersza w sql
funkcja daty w Oracle