Zum Inhalt springen

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 INTEGER und VARCHAR.

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 0x bzw. 0b können jedoch in Integer-Typen gecastet werden, z. B. '0xFF'::INT = 255 oder 0b101::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.5
SELECT .50; -- 0.5
SELECT 2.; -- 2.0

Nicht-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; -- 100
SELECT 6.02214e23; -- Avogadro's constant
SELECT 1e-10; -- 1 ångström

Unterstriche 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; -- 100000000
SELECT '0xFF_FF'::INTEGER; -- 65535
SELECT 1_2.1_2E0_1; -- 121.2
SELECT '0b0_1_0_1'::INTEGER; -- 5

String-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;
Terminal window
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 result
FROM (VALUES (DATE '1992-01-01')) t(d);
result
false

Wir können jedoch VARCHAR-Werte nicht mit Daten vergleichen.

SELECT d > '1992-01-01'::VARCHAR
FROM (VALUES (DATE '1992-01-01')) t(d);
Terminal window
Binder Error:
Cannot compare values of type DATE and type VARCHAR - an explicit cast is required

Escape-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 $$Hello
world$$ 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.