Literal-Typen
DuckDB hat besondere Literal-Typen zur Darstellung von NULL-, Integer- und String-Literalen in Abfragen. Diese haben eigene Bindungs- und Umwandlungsregeln.
Vor DuckDB-Version 0.10.0 verhielten sich Integer- und String-Literale identisch zu den Typen
INTEGERundVARCHAR.
Null-Literale
Das NULL-Literal wird mit dem Schlüsselwort NULL bezeichnet. Das NULL-Literal kann implizit in jeden anderen Typ umgewandelt werden.
Integer-Literale
Integer-Literale werden als Folge einer oder mehrerer Dezimalziffern bezeichnet. Zur Laufzeit ergeben sie Werte des Typs INTEGER_LITERAL. Typen INTEGER_LITERAL können implizit in jeden Integer-Typ umgewandelt werden, in den der Wert passt. Das Integer-Literal 42 kann beispielsweise implizit in ein TINYINT umgewandelt werden, das Integer-Literal 1000 jedoch nicht.
DuckDB unterstützt Hexadezimal- oder Binärliterale nicht direkt. Zeichenketten oder String-Literale in hexadezimaler oder binärer Notation mit den Präfixen
0xbzw.0bkönnen jedoch in Integer-Typen gecastet werden, z. B.'0xFF'::INT = 255oder0b101::INT = 5.
Weitere numerische Literale
Nicht-ganzzahlige numerische Literale können in Dezimalschreibweise angegeben werden, wobei das Punktzeichen (.) den ganzzahligen Teil vom Dezimalteil der Zahl trennt.
Entweder der ganzzahlige Teil oder der Dezimalteil kann weggelassen werden:
SELECT 1.5; -- 1.5SELECT .50; -- 0.5SELECT 2.; -- 2.0Nicht-ganzzahlige numerische Literale können auch in E-Notation angegeben werden. In der E-Notation folgt auf ein Integer- oder Dezimalliteral ein Exponentialteil, der durch e oder E und ein nachfolgendes Integer-Literal für den Exponenten bezeichnet wird.
Der Exponentialteil gibt an, dass der vorangehende Wert mit 10 hoch dem Exponenten multipliziert werden soll:
SELECT 1e2; -- 100SELECT 6.02214e23; -- Avogadro's constantSELECT 1e-10; -- 1 ångströmUnterstriche in numerischen Literalen
Der SQL-Dialekt von DuckDB erlaubt das Unterstrichzeichen _ in numerischen Literalen als optionalen Trenner. Die Regeln für Unterstriche sind:
- Unterstriche sind in Integer-, Dezimal-, Hexadezimal- und Binärnotation erlaubt.
- Unterstriche dürfen nicht das erste oder letzte Zeichen in einem Literal sein.
- Unterstriche müssen auf beiden Seiten einen ganzzahligen/numerischen Teil haben, d. h. es dürfen nicht mehrere Unterstriche hintereinander stehen und Unterstriche dürfen nicht unmittelbar vor oder nach einem Dezimalpunkt oder Exponenten stehen.
Beispiele:
SELECT 100_000_000; -- 100000000SELECT '0xFF_FF'::INTEGER; -- 65535SELECT 1_2.1_2E0_1; -- 121.2SELECT '0b0_1_0_1'::INTEGER; -- 5String-Literale
String-Literale werden mit einfachen Anführungszeichen (', Apostroph) begrenzt und ergeben Werte vom Typ STRING_LITERAL.
Beachten Sie, dass doppelte Anführungszeichen (") nicht als String-Begrenzer verwendet werden können: Stattdessen werden doppelte Anführungszeichen verwendet, um quoted Identifiers zu begrenzen.
Implizite Konkatenation von String-Literalen
Aufeinanderfolgende einfach-quotierte String-Literale, die nur durch Whitespace mit mindestens einem Zeilenumbruch getrennt sind, werden implizit konkateniert:
SELECT 'Hello' ' ' 'World' AS greeting;ist äquivalent zu:
SELECT 'Hello' || ' ' || 'World' AS greeting;Beide liefern das folgende Ergebnis:
| greeting |
|---|
| Hello World |
Beachten Sie, dass implizite Konkatenation nur funktioniert, wenn mindestens ein Zeilenumbruch zwischen den Literalen steht. Benachbarte String-Literale, die durch Whitespace ohne Zeilenumbruch getrennt sind, führen zu einem Syntaxfehler:
SELECT 'Hello' ' ' 'World' AS greeting;Parser Error:syntax error at or near "' '"
LINE 1: SELECT 'Hello' ' ' 'World' AS greeting; ^Beachten Sie außerdem, dass implizite Konkatenation nur mit einfach-quotierten String-Literalen funktioniert und nicht mit anderen Arten von String-Werten.
Implizite String-Umwandlung
Instanzen von STRING_LITERAL können implizit in jeden anderen Typ umgewandelt werden.
Wir können beispielsweise String-Literale mit Daten vergleichen:
SELECT d > '1992-01-01' AS resultFROM (VALUES (DATE '1992-01-01')) t(d);| result |
|---|
| false |
Wir können jedoch VARCHAR-Werte nicht mit Daten vergleichen.
SELECT d > '1992-01-01'::VARCHARFROM (VALUES (DATE '1992-01-01')) t(d);Binder Error:Cannot compare values of type DATE and type VARCHAR - an explicit cast is requiredEscape-String-Literale
Um ein einfaches Anführungszeichen (Apostroph) in einem String-Literal zu escapen, verwenden Sie ''. Beispielsweise liefert SELECT '''' AS s '.
Um einige gängige Escape-Sequenzen zu aktivieren, etwa \n für das Zeilenumbruchzeichen, stellen Sie einem String-Literal e (oder E) voran.
SELECT e'Hello\nworld' AS msg;┌──────────────┐│ msg ││ varchar │├──────────────┤│ Hello\nworld │└──────────────┘Die folgenden Backslash-Escape-Sequenzen werden unterstützt:
| Escape-Sequenz | Name | ASCII-Code |
|---|---|---|
\b |
Backspace | 8 |
\f |
Form Feed | 12 |
\n |
Zeilenumbruch | 10 |
\r |
Wagenrücklauf | 13 |
\t |
Tabulator | 9 |
Dollar-quoted String-Literale
DuckDB unterstützt dollar-quoted String-Literale, die von Doppel-Dollar-Symbolen ($$) umgeben sind:
SELECT $$Helloworld$$ AS msg;┌──────────────┐│ msg ││ varchar │├──────────────┤│ Hello\nworld │└──────────────┘SELECT $$The price is $9.95$$ AS msg;| msg |
|---|
| The price is $9.95 |
Darüber hinaus können Sie alphanumerische Tags in die Doppel-Dollar-Symbole einfügen, um die Verwendung regulärer Doppel-Dollar-Symbole innerhalb des String-Literals zu erlauben:
SELECT $tag$ this string can contain newlines,'single quotes',"double quotes",and $$dollar quotes$$ $tag$ AS msg;┌────────────────────────────────────────────────────────────────────────────────────────────────┐│ msg ││ varchar │├────────────────────────────────────────────────────────────────────────────────────────────────┤│ this string can contain newlines,\n'single quotes',\n"double quotes",\nand $$dollar quotes$$ │└────────────────────────────────────────────────────────────────────────────────────────────────┘Implizite Konkatenation funktioniert nur für einfach-quotierte String-Literale, nicht für dollar-quoted.