- Kategorien:
Aggregatfunktionen (Allgemein), Syntax und Verwendung von Fensterfunktionen (Allgemein)
LISTAGG¶
Gibt die verketteten Eingabewerte zurück, getrennt durch die delimiter
-Zeichenfolge:
Syntax¶
Aggregatfunktion
LISTAGG( [ DISTINCT ] <expr1> [, <delimiter> ] )
[ WITHIN GROUP ( <orderby_clause> ) ]
Fensterfunktionen
LISTAGG( [ DISTINCT ] <expr1> [, <delimiter> ] )
[ WITHIN GROUP ( <orderby_clause> ) ]
OVER ( [ PARTITION BY <expr2> ] )
Erforderliche Argumente¶
expr1
Ein Ausdruck (normalerweise ein Spaltenname), der über die Werte bestimmt, die in die Liste aufgenommen werden. Der Ausdruck muss als Zeichenfolge ausgewertet werden oder als Datentyp, der in eine Zeichenfolge umgewandelt werden kann.
OVER()
Die OVER-Klausel ist erforderlich, wenn die Funktion als Fensterfunktion verwendet wird. Weitere Details dazu finden Sie unter Syntax und Verwendung von Fensterfunktionen.
Optionale Argumente¶
DISTINCT
Entfernt doppelte Werte aus der Liste.
delimiter
Eine Zeichenfolge oder ein Ausdruck, der eine Zeichenfolge ergibt. Normalerweise ist dieser Wert eine einstellige Zeichenfolge. Die Zeichenfolge muss in einfache Anführungszeichen gesetzt werden, wie in den folgenden Beispielen veranschaulicht.
Wenn keine
delimiter
angegeben ist, wird eine leere Zeichenfolge alsdelimiter
verwendet.delimiter
muss eine Konstante sein.WITHIN GROUP orderby_clause
ein oder mehrere Ausdrücke (typischerweise Spaltennamen) enthält, die die Reihenfolge der Werte für jede Gruppe in der Liste bestimmen.
Die Syntax WITHIN GROUP (ORDER BY) unterstützt dieselben Parameter wie die ORDER BY-Klausel in einer SELECT-Anweisung.
PARTITION BY expr2
Unterklausel der Fensterfunktion, die einen Ausdruck (normalerweise einen Spaltennamen) angibt. Dieser Ausdruck definiert Partitionen, die die Eingabezeilen gruppieren, bevor die Funktion angewendet wird. Weitere Details dazu finden Sie unter Syntax und Verwendung von Fensterfunktionen.
Rückgabewerte¶
Gibt eine Zeichenfolge zurück, die alle Nicht-NULL-Eingabewerte enthält, getrennt durch das delimiter
.
Diese Funktion gibt weder eine Liste noch ein Array zurück. Gibt eine einzelne Zeichenfolge zurück, die alle Nicht-NULL-Eingabewerte enthält.
Nutzungshinweise¶
Wenn Sie WITHIN GROUP(ORDER BY) nicht angeben, ist die Reihenfolge der Elemente in jeder Liste unvorhersehbar. (Eine ORDER BY-Klausel außerhalb der WITHIN GROUP-Klausel wird auf die Reihenfolge der Ausgabezeilen angewendet, jedoch nicht auf die Reihenfolge der Listenelemente innerhalb einer Zeile.)
Wenn Sie für einen Ausdruck in WITHIN GROUP (ORDER BY) eine Zahl angeben, wird diese Zahl als numerische Konstante geparst, nicht als Ordinalposition einer Spalte in der SELECT-Liste. Geben Sie daher keine Zahlen als WITHIN GROUP (ORDER BY)-Ausdrücke an.
Wenn Sie DISTINCT und WITHIN GROUP angeben, müssen sich beide auf die gleiche Spalte beziehen. Beispiel:
SELECT LISTAGG(DISTINCT O_ORDERKEY) WITHIN GROUP (ORDER BY O_ORDERKEY) ...;
Wenn Sie unterschiedliche Spalten für DISTINCT und WITHIN GROUP angeben, tritt ein Fehler auf:
SELECT LISTAGG(DISTINCT O_ORDERKEY) WITHIN GROUP (ORDER BY O_ORDERSTATUS) ...;
SQL compilation error: [ORDERS.O_ORDERSTATUS] is not a valid order by expression
Sie müssen entweder die gleiche Spalte für DISTINCT und WITHIN GROUP angeben oder DISTINCT weglassen.
In Bezug auf NULL oder leere Eingabewerte:
Wenn die Eingabe leer ist, wird eine leere Zeichenfolge zurückgegeben.
Wenn alle Eingabeausdrücke NULL ergeben, ist die Ausgabe eine leere Zeichenfolge.
Wenn einige, aber nicht alle Eingabeausdrücke NULL ergeben, enthält die Ausgabe alle Nicht-NULL-Werte, während alle NULL-Werte ausgeschlossen werden.
Wenn diese Funktion als Fensterfunktion aufgerufen wird, wird sie nicht unterstützt:
Eine ORDER BY-Klausel innerhalb der OVER-Klausel.
Explizite Fensterrahmen.
Sortierungsdetails¶
The collation of the result is the same as the collation of the input.
Die Elemente innerhalb der Liste sind nach Sortierungen geordnet, wenn die Unterklausel ORDER BY einen Ausdruck mit Sortierung angibt.
Das
delimiter
kann keine Sortierungsspezifikation verwenden.Das Angeben von Sortierung in ORDER BY hat keinen Einfluss auf die Sortierung des Ergebnisses. Die folgende Anweisung enthält beispielsweise zwei ORDER BY-Klauseln, eine für LISTAGG und eine für die Abfrageergebnisse. Das Festlegen der Sortierung innerhalb der ersten Klausel hat keinen Einfluss auf die Sortierung der zweiten. Wenn Sie die Ausgabe in beiden ORDER BY-Klauseln sortieren möchten, müssen Sie Sortierung in beiden Klauseln explizit angeben.
SELECT LISTAGG(x, ', ') WITHIN GROUP (ORDER BY last_name COLLATE 'es') FROM table1 ORDER BY last_name;
Beispiele¶
Diese Beispiele verwenden die Funktion LISTAGG.
Verwendung der LISTAGG-Funktion zur Verkettung von Werten in Abfrageergebnissen¶
In den folgenden Beispielen wird die Funktion LISTAGG verwendet, um Werte in den Ergebnissen von Abfragen zu Bestelldaten zu verketten.
Bemerkung
Diese Beispiele fragen die TPC-H-Beispieldaten ab. Bevor Sie die Abfragen ausführen, führen Sie die folgende SQL-Anweisung aus:
USE SCHEMA snowflake_sample_data.tpch_sf1;
Dieses Beispiel listet die unterschiedlichen o_orderkey
-Werte für Bestellungen auf, deren o_totalprice
größer als 520000
ist, und verwendet eine leere Zeichenfolge für delimiter
:
SELECT LISTAGG(DISTINCT o_orderkey, ' ')
FROM orders
WHERE o_totalprice > 520000;
+-------------------------------------------------+
| LISTAGG(DISTINCT O_ORDERKEY, ' ') |
|-------------------------------------------------|
| 2232932 1750466 3043270 4576548 4722021 3586919 |
+-------------------------------------------------+
Dieses Beispiel listet die unterschiedlichen Werte von o_orderstatus
für Bestellungen auf, bei denen o_totalprice
größer als 520000
ist, und verwendet einen vertikalen Balken für delimiter
:
SELECT LISTAGG(DISTINCT o_orderstatus, '|')
FROM orders
WHERE o_totalprice > 520000;
+--------------------------------------+
| LISTAGG(DISTINCT O_ORDERSTATUS, '|') |
|--------------------------------------|
| O|F |
+--------------------------------------+
Dieses Beispiel listet die Werte von o_orderstatus
und o_clerk
für jede Bestellung mit einem o_totalprice
größer als 520000
gruppiert nach o_orderstatus
auf. Die Abfrage verwendet ein Komma als delimiter
:
SELECT o_orderstatus,
LISTAGG(o_clerk, ', ')
WITHIN GROUP (ORDER BY o_totalprice DESC)
FROM orders
WHERE o_totalprice > 520000
GROUP BY o_orderstatus;
+---------------+---------------------------------------------------+
| O_ORDERSTATUS | LISTAGG(O_CLERK, ', ') |
| | WITHIN GROUP (ORDER BY O_TOTALPRICE DESC) |
|---------------+---------------------------------------------------|
| O | Clerk#000000699, Clerk#000000336, Clerk#000000245 |
| F | Clerk#000000040, Clerk#000000230, Clerk#000000924 |
+---------------+---------------------------------------------------+
Verwendung der Sortierung mit der Funktion LISTAGG¶
Die folgenden Beispiele zeigen die Sortierung mit der Funktion LISTAGG. Die Beispiele verwenden die folgenden Daten:
CREATE OR REPLACE TABLE collation_demo (
spanish_phrase VARCHAR COLLATE 'es');
INSERT INTO collation_demo (spanish_phrase) VALUES
('piña colada'),
('Pinatubo (Mount)'),
('pint'),
('Pinta');
Beachten Sie bei den verschiedenen Sortierungsspezifikationen den Unterschied in der Ausgabereihenfolge. Diese Abfrage verwendet die Sortierungsspezifikation es
:
SELECT LISTAGG(spanish_phrase, '|')
WITHIN GROUP (ORDER BY COLLATE(spanish_phrase, 'es')) AS es_collation
FROM collation_demo;
+-----------------------------------------+
| ES_COLLATION |
|-----------------------------------------|
| Pinatubo (Mount)|pint|Pinta|piña colada |
+-----------------------------------------+
Diese Abfrage verwendet die Sortierungsspezifikation utf8
:
SELECT LISTAGG(spanish_phrase, '|')
WITHIN GROUP (ORDER BY COLLATE(spanish_phrase, 'utf8')) AS utf8_collation
FROM collation_demo;
+-----------------------------------------+
| UTF8_COLLATION |
|-----------------------------------------|
| Pinatubo (Mount)|Pinta|pint|piña colada |
+-----------------------------------------+