- 安装
- 文档
- 入门
- 连接
- 数据导入
- 客户端 API
- 概览
- ADBC
- C
- C++
- CLI
- Dart
- Go
- Java (JDBC)
- Julia
- Node.js (已弃用)
- Node.js (Neo)
- ODBC
- PHP
- Python
- R
- Rust
- Swift
- Wasm
- SQL
- 介绍
- 语句
- 概览
- ANALYZE
- ALTER TABLE
- ALTER VIEW
- ATTACH 和 DETACH
- CALL
- CHECKPOINT
- COMMENT ON
- COPY
- CREATE INDEX
- CREATE MACRO
- CREATE SCHEMA
- CREATE SECRET
- CREATE SEQUENCE
- CREATE TABLE
- CREATE VIEW
- CREATE TYPE
- DELETE
- DESCRIBE
- DROP
- EXPORT 和 IMPORT DATABASE
- INSERT
- LOAD / INSTALL
- PIVOT
- 性能分析
- SELECT
- SET / RESET
- SET VARIABLE
- SUMMARIZE
- 事务管理
- UNPIVOT
- UPDATE
- USE
- VACUUM
- 查询语法
- SELECT
- FROM 和 JOIN
- WHERE
- GROUP BY
- GROUPING SETS
- HAVING
- ORDER BY
- LIMIT 和 OFFSET
- SAMPLE
- 展开嵌套
- WITH
- WINDOW
- QUALIFY
- VALUES
- FILTER
- 集合操作
- 预处理语句
- 数据类型
- 表达式
- 函数
- 概览
- 聚合函数
- 数组函数
- 位字符串函数
- Blob 函数
- 日期格式化函数
- 日期函数
- 日期部分函数
- 枚举函数
- 间隔函数
- Lambda 函数
- 列表函数
- 映射函数
- 嵌套函数
- 数值函数
- 模式匹配
- 正则表达式
- 结构体函数
- 文本函数
- 时间函数
- 时间戳函数
- 带时区时间戳函数
- 联合函数
- 实用函数
- 窗口函数
- 约束
- 索引
- 元查询
- DuckDB 的 SQL 方言
- 示例
- 配置
- 扩展
- 核心扩展
- 概览
- 自动补全
- Avro
- AWS
- Azure
- Delta
- DuckLake
- 编码
- Excel
- 全文搜索
- httpfs (HTTP 和 S3)
- Iceberg
- ICU
- inet
- jemalloc
- MySQL
- PostgreSQL
- 空间
- SQLite
- TPC-DS
- TPC-H
- UI
- VSS
- 指南
- 概览
- 数据查看器
- 数据库集成
- 文件格式
- 概览
- CSV 导入
- CSV 导出
- 直接读取文件
- Excel 导入
- Excel 导出
- JSON 导入
- JSON 导出
- Parquet 导入
- Parquet 导出
- 查询 Parquet 文件
- 使用 file: 协议访问文件
- 网络和云存储
- 概览
- HTTP Parquet 导入
- S3 Parquet 导入
- S3 Parquet 导出
- S3 Iceberg 导入
- S3 Express One
- GCS 导入
- Cloudflare R2 导入
- 通过 HTTPS / S3 使用 DuckDB
- Fastly 对象存储导入
- 元查询
- ODBC
- 性能
- Python
- 安装
- 执行 SQL
- Jupyter Notebooks
- marimo Notebooks
- Pandas 上的 SQL
- 从 Pandas 导入
- 导出到 Pandas
- 从 Numpy 导入
- 导出到 Numpy
- Arrow 上的 SQL
- 从 Arrow 导入
- 导出到 Arrow
- Pandas 上的关系型 API
- 多个 Python 线程
- 与 Ibis 集成
- 与 Polars 集成
- 使用 fsspec 文件系统
- SQL 编辑器
- SQL 功能
- 代码片段
- 故障排除
- 术语表
- 离线浏览
- 操作手册
- 开发
- 内部结构
- 为什么选择 DuckDB
- 行为准则
- 发布日历
- 路线图
- 站点地图
- 在线演示
DuckDB 有特殊的字面量类型,用于在查询中表示 NULL
、整数和字符串字面量。它们有自己的绑定和转换规则。
在 DuckDB 0.10.0 版本之前,整数和字符串字面量的行为与
INTEGER
和VARCHAR
类型完全相同。
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 表示法中,整数或小数常量后面跟着一个指数部分,由 e
或 E
表示,接着是一个表示指数的整数常量。指数部分表示前一个值应乘以 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$$ │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
隐式连接仅适用于单引号字符串字面量,不适用于美元引号字符串字面量。