⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
字面量类型

DuckDB 有特殊的字面量类型,用于在查询中表示 NULL、整数和字符串字面量。它们有自己的绑定和转换规则。

在 DuckDB 0.10.0 版本之前,整数和字符串字面量的行为与 INTEGERVARCHAR 类型完全相同。

NULL 字面量

关键字 NULL 表示 NULL 字面量。NULL 字面量可以隐式转换为任何其他类型。

整数字面量

整数字面量表示为一个或多个数字的序列。在运行时,它们会产生 INTEGER_LITERAL 类型的值。INTEGER_LITERAL 类型可以隐式转换为值适合的任何整数类型。例如,整数字面量 42 可以隐式转换为 TINYINT,但整数字面量 1000 不能。

其他数字字面量

非整数数字字面量可以用十进制表示法表示,使用句点字符 (.) 分隔整数部分和小数部分。整数部分或小数部分可以省略。

SELECT 1.5;          -- 1.5
SELECT .50;          -- 0.5
SELECT 2.;           -- 2.0

非整数数字字面量也可以使用E 表示法表示。在 E 表示法中,整数或小数常量后面跟着一个指数部分,由 eE 表示,接着是一个表示指数的整数常量。指数部分表示前一个值应乘以 10 的指数次幂。

SELECT 1e2;           -- 100
SELECT 6.02214e23;    -- Avogadro's constant
SELECT 1e-10;         -- 1 ångström

数字字面量中的下划线

DuckDB 的 SQL 方言允许在数字字面量中使用下划线字符 _ 作为可选分隔符。使用下划线的规则如下:

  • 下划线允许用于整数、小数、十六进制和二进制表示法。
  • 下划线不能是字面量的第一个或最后一个字符。
  • 下划线的两侧必须有整数/数字部分,即不能连续出现多个下划线,也不能紧接在小数点或指数之前/之后。

示例

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_LITERAL 值。请注意,双引号 (") 不能用作字符串分隔符:相反,双引号用于分隔引用标识符

隐式字符串字面量连接

连续的单引号字符串字面量,仅由包含至少一个换行符的空白字符分隔,会被隐式连接。

SELECT 'Hello'
    ' '
    'World' AS greeting;

等同于

SELECT 'Hello'
    || ' '
    || 'World' AS greeting;

它们都返回以下结果

greeting
Hello World

请注意,隐式连接仅在字面量之间至少有一个换行符时才有效。使用相邻字符串字面量且仅由没有换行符的空白字符分隔会导致语法错误。

SELECT 'Hello' ' ' 'World' AS greeting;
Parser Error:
syntax error at or near "' '"

LINE 1: SELECT 'Hello' ' ' 'World' AS greeting;
                       ^

另请注意,隐式连接仅适用于单引号字符串字面量,不适用于其他类型的字符串值。

隐式字符串转换

STRING_LITERAL 实例可以隐式转换为任何其他类型。

例如,我们可以将字符串字面量与日期进行比较

SELECT d > '1992-01-01' AS result
FROM (VALUES (DATE '1992-01-01')) t(d);
结果
false

但是,我们不能将 VARCHAR 值与日期进行比较。

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

转义字符串字面量

要在字符串字面量中转义单引号(撇号)字符,请使用 ''。例如,SELECT '''' AS s 返回 '

要启用一些常见的转义序列,例如表示换行符的 \n,请在字符串字面量前加上 e(或 E)。

SELECT e'Hello\nworld' AS msg;
┌──────────────┐
│     msg      │
│   varchar    │
├──────────────┤
│ Hello\nworld │
└──────────────┘

支持以下反斜杠转义序列:

转义序列 名称 ASCII 码
\b 退格符 8
\f 换页符 12
\n 换行符 10
\r 回车符 13
\t 制表符 9

美元引号字符串字面量

DuckDB 支持美元引号字符串字面量,它们由双美元符号 ($$) 包裹。

SELECT $$Hello
world$$ AS msg;
┌──────────────┐
│     msg      │
│   varchar    │
├──────────────┤
│ Hello\nworld │
└──────────────┘
SELECT $$The price is $9.95$$ AS msg;
msg
The price is $9.95

更进一步,您可以在双美元符号中插入字母数字标签,以允许在字符串字面量内部使用常规的双美元符号。

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$$  │
└────────────────────────────────────────────────────────────────────────────────────────────────┘

隐式连接仅适用于单引号字符串字面量,不适用于美元引号字符串字面量。