Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak korzystać z funkcji Oracle LITAGG

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; BILL

More 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ły
Kolumna 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Znajdź długość najdłuższego wiersza w kolumnie w Oracle

  2. Powód, dla którego Oracle rozróżnia wielkość liter?

  3. Jak mogę wyodrębnić pliki z pola Oracle BLOB?

  4. Konfigurowanie integracji danych Pentaho do korzystania z portfela Oracle dla Oracle Cloud

  5. Wstawianie nowych kolumn na środku tabeli?