⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
字面量类型

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

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

NULL 字面量

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

整数型字面量

整数型字面量表示为一个或多个十进制数字的序列。在运行时,它们的结果为 INTEGER_LITERAL 类型。INTEGER_LITERAL 类型可以隐式转换为任何能够容纳该值的整数类型。例如,整数型字面量 42 可以隐式转换为 TINYINT,但整数型字面量 1000 则不能。

DuckDB 不直接支持十六进制或二进制字面量。但是,带有 0x0b 前缀的十六进制或二进制表示的字符串或字符串字面量可以被强制转换为整数类型,例如:'0xFF'::INT = 2550b101::INT = 5

其他数值型字面量

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

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

非整数的数值型字面量也可以使用科学计数法 (E notation) 表示。在科学计数法中,整数或十进制字面量后跟一个指数部分,该部分由 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$$  │
└────────────────────────────────────────────────────────────────────────────────────────────────┘

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

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南