Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So verwenden Sie die Oracle LISTAGG-Funktion

Oracle LISTAGG-Funktion ist eine analytische Funktion, die es uns ermöglicht, die Zeichenfolgen für measure_column für jede GROUP basierend auf der order_by_clause zu verketten. Dies ist in Oracle ab 11gR2

vorhanden

Die Syntax für die LISTAGG-Funktion in Oracle ist

LISTAGG (Measure_column [, 'delimiter'])
WITHIN GROUP (order_by_clause) [ OVER (query_partition_clause)]

Begriffserklärung

Measure_column Die Spalte oder der Ausdruck, deren Werte Sie in der Ergebnismenge verketten möchten. Nullwerte in der measure_column werden ignoriert.
Trennzeichen Optional. Es ist das Trennzeichen, das beim Trennen der Measure_column verwendet werden muss Werte bei der Ergebnisausgabe.
order_by_clause Er bestimmt die Reihenfolge, in der die verketteten Werte zurückgegeben werden

Sehen wir uns einige Fälle und Beispiele für die LISTAGG-Funktion an

1) Als Single-Set-Aggregatfunktion wirkt LISTAGG auf alle Zeilen und gibt eine einzelne Ausgabezeile zurück.

SELECT LISTAGG(Vorname, '; ')
WITHIN GROUP (ORDER BY Einstellungsdatum, Nachname) "Mitarbeiterliste",
MIN(Einstellungsdatum) "Früheste"
FROM emp
WHERE abt_nr =30;

Mitarbeiterliste                                                Früheste
------------------------------------------- ---------------- ---------
TOM; BOB; RECHNUNG                                                          17-JUN-18

2) Als Group-Set-Aggregat operiert die Funktion und gibt eine Ausgabezeile für jede Gruppe zurück, die durch die GROUP BY-Klausel definiert ist.

SPALTE Mitarbeiter FORMAT A50
SELECT Abtnr, LISTAGG(Ename, ';') INNERHALB DER GRUPPE (ORDNEN NACH E-Name) AS Mitarbeiter
VON Angestellt
GRUPPE NACH AbtNr;
ABTNR MITARBEITER
---------- ----------------------------------- ---------------
10 JOSHUA, KING, MILLER
20 AJAY, FANES, SCOTT, SMITH
30 TOM; BOB; RECHNUNG

Weiteres Beispiel

select table_name,
listagg(index_name, ',') within group (order by index_name) all_inds
from user_indexes
group by table_name;

3)Als analytische Funktion partitioniert LISTAGG die Ergebnismenge der Abfrage in Gruppen basierend auf einem oder mehreren Ausdrücken in der query_partition_clause.

SQL> SELECT Abteilungsnummer
, Ename
, Einstellungsdatum
, LISTAGG(Ename, ',')
MIT GRUPPE (ORDER BY Einstellungsdatum)
ÜBER (PARTITION NACH Abteilungsnummer) AS-Mitarbeiter
FROM emp  order by deptnr;

DEPTNO ENAME EINGESTELLTE MITARBEITER
---------- ---------- ----------- ----------- ---------------------
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; RECHNUNG
30 RECHNUNG 05.01.2018 TOM; BOB; RECHNUNG

Zusatz in der LISTAGG-Funktion aus der Oracle-Datenbank 12cR2

Die maximale Anzahl der zurückgegebenen Zeichen beträgt 4000 Bytes, und wenn sie überschritten wird, wird der Fehler ausgegeben

ORA-01489:Ergebnis der Zeichenfolgenverkettung ist zu lang

Mit Oracle 12cR2 hat Oracle eine Klausel für das Abschneiden von Überläufen bereitgestellt, um Überlauffehler ordnungsgemäß zu behandeln

listagg (
Kennzahl, ','
[ bei Überlauf (Abschneiden|Fehler) ]
[ Text ] [ (mit|ohne) Anzahl ]
) innerhalb der Gruppe (Reihenfolge nach Spalten )

Jetzt können Sie explizit angeben, ob Sie eine Fehler- oder Kürzungssemantik wünschen. Die Codes vor 12cR2 funktionieren gut, da dies das Standardverhalten ist

Nehmen wir nun an, Sie möchten keinen Fehler zurückgeben, wenn er 4 KB überschreitet, und dann bei Überlauf abschneiden ist die Lösung.

select table_name,
listagg(index_name, ',' on overflow truncate) within group (order by index_name) inds
from user_indexes
group by table_name;

Falls eine Kürzung auftritt, schneidet Oracle auf den nächsten vollen Wert zurück. An diesem Punkt können Sie steuern, wie Sie dem Benutzer mitteilen, dass die Liste gekürzt wurde. Standardmäßig hängen wir drei Punkte „…“ an die Zeichenfolge an, um darauf hinzuweisen, dass eine Kürzung aufgetreten ist. Sie können das „….“ ändern, wenn Sie möchten, können Sie es überschreiben

Wenn Sie „…“ durch „mehr“, „extra“ oder einen „Klick für mehr“-Hyperlink ersetzen möchten, geben Sie einfach Ihre neue Zeichenfolge ein!

select table_name,
listagg(index_name, ',' on overflow truncate
'|||'
) within group (order by index_name) inds
from user_indexes
group nach Tabellenname;

Standardmäßig zeigt truncate die Anzahl der fehlenden Werte an. Wenn Sie die Anzahl nicht anzeigen möchten, verwenden Sie ohne Anzahl

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;

Pre-11GR2-Lösung (10 g, 9i, 11gR1)

Wenn Sie nicht 11g Release 2 oder höher ausführen, aber eine Version der Datenbank ausführen, in der die WM_CONCAT-Funktion vorhanden ist, dann ist dies eine Lösung ohne Aufwand, da sie die Aggregation für Sie durchführt. Es ist eigentlich ein Beispiel für eine unten beschriebene benutzerdefinierte Aggregatfunktion, aber Oracle hat die ganze Arbeit für Sie erledigt.

COLUMN angestellte FORMAT A50
SELECT abtnr, wm_concat(ename) AS angestellte
FROM emp
GROUP BY abtnr;
EPTNO ANGESTELLTE
------ ---- ---------------------------------------------- ----
10 JOSHUA, KING, MILLER
20 AJAY, FANES, SCOTT, SMITH
30 TOM; BOB; RECHNUNG

Dies kann auch durch benutzerdefinierte Funktionen erreicht werden. Ich würde empfehlen, den folgenden Asktom-Link zu überprüfen. Dies muss gelesen werden

Listagg-Alternativoption

Ich hoffe, Ihnen gefällt der Inhalt dieses Beitrags zur  Oracle LISTAGG-Funktion

Verwandte Artikel
Spalte automatisch inkrementieren – Sequenz als Standardwert in Oracle und mysql
Oracle Joins
Sql-Set-Operatoren
Verwendung der URL von Google Translate in Oracle plsql
Einzelzeilenfunktionen in sql
Datumsfunktion in Oracle