- 安装
- 文档
- 入门
- 连接
- 数据导入与导出
- 湖仓格式
- 客户端 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
- MERGE INTO
- PIVOT
- 性能分析
- SELECT
- SET / RESET
- SET VARIABLE
- SHOW 与 SHOW DATABASES
- 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
- Lance
- MySQL
- PostgreSQL
- 空间
- SQLite
- TPC-DS
- TPC-H
- UI
- Unity Catalog
- Vortex
- 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
- 日志
- 保护 DuckDB 安全
- 非确定性行为
- 限制
- DuckDB Docker 容器
- 开发
- 内部结构
- 站点地图
- 在线演示
DuckDB 具有特殊的字面量类型,用于在查询中表示 NULL、整数和字符串字面量。它们有自己独立的绑定和转换规则。
在 DuckDB 0.10.0 版本之前,整数和字符串字面量的行为与
INTEGER和VARCHAR类型完全相同。
NULL 字面量
NULL 字面量使用关键字 NULL 表示。NULL 字面量可以隐式转换为任何其他类型。
整数型字面量
整数型字面量表示为一个或多个十进制数字的序列。在运行时,它们的结果为 INTEGER_LITERAL 类型。INTEGER_LITERAL 类型可以隐式转换为任何能够容纳该值的整数类型。例如,整数型字面量 42 可以隐式转换为 TINYINT,但整数型字面量 1000 则不能。
DuckDB 不直接支持十六进制或二进制字面量。但是,带有
0x或0b前缀的十六进制或二进制表示的字符串或字符串字面量可以被强制转换为整数类型,例如:'0xFF'::INT = 255或0b101::INT = 5。
其他数值型字面量
非整数的数值型字面量可以使用十进制表示法,使用小数点字符(.)来分隔整数部分和小数部分。整数部分和小数部分均可省略。
SELECT 1.5; -- 1.5
SELECT .50; -- 0.5
SELECT 2.; -- 2.0
非整数的数值型字面量也可以使用科学计数法 (E notation) 表示。在科学计数法中,整数或十进制字面量后跟一个指数部分,该部分由 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$$ │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
隐式连接仅适用于单引号字符串字面量,不适用于美元符号引用的字符串字面量。