Der Ausdruck * kann in einer SELECT-Anweisung verwendet werden, um alle Spalten auszuwählen, die in der Klausel FROM projeziert werden.
SELECT*
FROM tbl;
TABLE.* und STRUCT.*
Dem Ausdruck * kann ein Tabellenname vorangestellt werden, um nur Spalten dieser Tabelle auszuwählen.
SELECT tbl.*
FROM tbl
JOIN other_tbl USING (id);
Ebenso kann der Ausdruck * verwendet werden, um alle Schlüssel eines Structs als separate Spalten abzurufen.
Das ist besonders nützlich, wenn eine vorherige Operation einen Struct unbekannter Form erzeugt oder eine Abfrage beliebige mögliche Struct-Schlüssel verarbeiten muss.
Details zur Arbeit mit Structs finden Sie auf den Seiten zum Datentyp STRUCT und zu den STRUCT-Funktionen.
Die MustervergleichsoperatorenLIKE, GLOB, SIMILAR TO und ihre Varianten erlauben es, Spalten anhand der Übereinstimmung ihrer Namen mit Mustern auszuwählen.
SELECT*LIKE'col%'
FROM tbl;
SELECT* GLOB 'col*'
FROM tbl;
SELECT* SIMILAR TO'col.'
FROM tbl;
Die NOT-Varianten dieser Operatoren werden ebenfalls unterstützt, um Spalten auszuschließen, die dem Muster entsprechen:
SELECT*NOT SIMILAR TO'col.'
FROM tbl;
COLUMNS-Ausdruck
Der Ausdruck COLUMNS ähnelt dem gewöhnlichen Stern-Ausdruck, erlaubt es aber zusätzlich, denselben Ausdruck auf den resultierenden Spalten auszuführen.
CREATETABLEnumbers (id INTEGER, numberINTEGER);
INSERT INTO numbers VALUES (1, 10), (2, 20), (3, NULL);
SELECTmin(COLUMNS(*)), count(COLUMNS(*)) FROM numbers;
id
number
id
number
1
10
3
2
SELECT
min(COLUMNS(*REPLACE (number+ id ASnumber))),
count(COLUMNS(* EXCLUDE (number)))
FROM numbers;
id
min(number := (number + id))
id
1
11
3
COLUMNS-Ausdrücke können auch kombiniert werden, solange sie denselben Stern-Ausdruck enthalten:
SELECT COLUMNS(*) + COLUMNS(*) FROM numbers;
id
number
2
20
4
40
6
NULL
COLUMNS-Ausdruck in einer WHERE-Klausel
COLUMNS-Ausdrücke können auch in WHERE-Klauseln verwendet werden. Die Bedingungen werden auf alle Spalten angewendet und mit dem logischen Operator AND kombiniert.
SELECT*
FROM (
SELECT'a', 'a'
UNION ALL
SELECT'a', 'b'
UNION ALL
SELECT'b', 'b'
) _(x, y)
WHERE COLUMNS(*) ='a'; -- equivalent to: x = 'a' AND y = 'a'
x
y
a
a
Um Bedingungen mit dem logischen Operator OR zu kombinieren, können Sie den COLUMNS-Ausdruck mit UNPACK in die variadische Funktion greatest entpacken.
SELECT*
FROM (
SELECT'a', 'a'
UNION ALL
SELECT'a', 'b'
UNION ALL
SELECT'b', 'b'
) _(x, y)
WHEREgreatest(UNPACK(COLUMNS(*) ='a')); -- equivalent to: x = 'a' OR y = 'a'
x
y
a
a
a
b
COLUMNS-Ausdruck in DISTINCT ON
COLUMNS-Ausdrücke können in Klauseln DISTINCT ON verwendet werden, um Distinct-Spalten per Muster anzugeben:
SELECT DISTINCTON (COLUMNS('x|y')) *
FROM (VALUES (1, 2, 'a'), (1, 2, 'b'), (3, 4, 'c')) t(x, y, z);
x
y
z
1
2
a
3
4
c
Reguläre Ausdrücke in einem COLUMNS-Ausdruck
COLUMNS-Ausdrücke unterstützen derzeit die Mustervergleichsoperatoren nicht, aber sie unterstützen den Abgleich mit regulären Ausdrücken, indem statt des Sterns einfach eine Zeichenkettenkonstante übergeben wird:
SELECT COLUMNS('(id|numbers?)') FROM numbers;
id
number
1
10
2
20
3
NULL
Spalten mit regulären Ausdrücken in einem COLUMNS-Ausdruck umbenennen
Die Treffer von Capture-Gruppen in regulären Ausdrücken können verwendet werden, um passende Spalten umzubenennen.
Die Capture-Gruppen sind 1-indiziert; \0 ist der ursprüngliche Spaltenname.
Um beispielsweise die ersten drei Buchstaben von Spaltennamen auszuwählen, führen Sie aus:
SELECT COLUMNS('(\w{3}).*') AS'\1'FROM numbers;
id
num
1
10
2
20
3
NULL
Um ein Doppelpunktzeichen (:) in der Mitte eines Spaltennamens zu entfernen, führen Sie aus:
Um den ursprünglichen Spaltennamen zum Ausdrucksalias hinzuzufügen, führen Sie aus:
SELECTmin(COLUMNS(*)) AS"min_\0"FROM numbers;
min_id
min_number
1
10
COLUMNS-Lambda-Funktion
COLUMNS unterstützt auch die Übergabe einer Lambda-Funktion.
Die Lambda-Funktion wird für alle in der Klausel FROM vorhandenen Spalten ausgewertet.
Nur Spalten, für die die Lambda-Funktion zu TRUE auswertet, bleiben erhalten, die übrigen werden verworfen.
Lambdas in der COLUMNS-Klausel haben einen Pflichtparameter, der den Spaltennamen erhält.
Optional kann ein zweiter Parameter deklariert werden, der den (1-basierten) Index der Spalte erhält.
Lambdas in der COLUMNS-Klausel erlauben die Ausführung beliebiger Ausdrücke, um Spalten auszuwählen und umzubenennen.
SELECT COLUMNS(lambda c: c LIKE'%num%') FROM numbers;
number
10
20
NULL
COLUMNS-Liste
COLUMNS unterstützt auch die Übergabe einer Liste von Spaltennamen.
SELECT COLUMNS(['id', 'num']) FROM numbers;
id
num
1
10
2
20
3
NULL
Entpacken eines COLUMNS-Ausdrucks
Indem Sie einen COLUMNS-Ausdruck in UNPACK wrappen, werden die Spalten in einen übergeordneten Ausdruck expandiert, ähnlich dem Entpacken von Iterables in Python.
Ohne UNPACK werden Operationen auf dem COLUMNS-Ausdruck auf jede Spalte einzeln angewendet:
SELECTcoalesce(COLUMNS(['a', 'b', 'c'])) AS result
FROM (SELECTNULL a, 42 b, true c);
result
result
result
NULL
42
true
Mit UNPACK wird der COLUMNS-Ausdruck in seinen übergeordneten Ausdruck expandiert, im Beispiel oben coalesce, was zu einer einzelnen Spalte führt:
SELECTcoalesce(UNPACK(COLUMNS(['a', 'b', 'c']))) AS result
FROM (SELECTNULLAS a, 42AS b, true AS c);
result
42
Das Schlüsselwort UNPACK kann durch * ersetzt werden, entsprechend der Python-Syntax, wenn es direkt auf den COLUMNS-Ausdruck ohne dazwischenliegende Operationen angewendet wird.
SELECTcoalesce(*COLUMNS(*)) AS result
FROM (SELECTNULL a, 42AS b, true AS c);
result
42
Warnung Im folgenden Beispiel führt das Ersetzen von UNPACK durch * zu einem Syntaxfehler:
SELECTgreatest(UNPACK(COLUMNS(*) +1)) AS result
FROM (SELECT1AS a, 2AS b, 3AS c);
result
4
STRUCT.*
Der Ausdruck * kann auch verwendet werden, um alle Schlüssel eines Structs als separate Spalten abzurufen.
Das ist besonders nützlich, wenn eine vorherige Operation einen Struct unbekannter Form erzeugt oder eine Abfrage beliebige mögliche Struct-Schlüssel verarbeiten muss.
Details zur Arbeit mit Structs finden Sie auf den Seiten zum Datentyp STRUCT und zu den STRUCT-Funktionen.
Dies ist eine inoffizielle Website und nicht mit DuckDB verbunden. Offizielle Seite:duckdb.org.duckdb.ubitools.com · Übersetzt und erstellt mit Astro und daisyUI