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
vorhandenDie 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 ArtikelSpalte 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