⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
关键词和标识符

标识符

与其他 SQL 方言和编程语言类似,DuckDB SQL 中的标识符需遵循若干规则。

  • 未加引号的标识符需符合以下规则:
    • 不能是保留关键字(参见 duckdb_keywords()),例如 SELECT 123 AS SELECT 将会报错。
    • 不能以数字或特殊字符开头,例如 SELECT 123 AS 1col 是无效的。
    • 不能包含空格(包括制表符和换行符)。
  • 标识符可以使用双引号 (") 引起来。加引号的标识符可以使用任何关键字、空格或特殊字符,例如 "SELECT"" § 🦆 ¶ " 都是有效的标识符。
  • 可以通过重复引号字符来转义双引号,例如,要创建一个名为 IDENTIFIER "X" 的标识符,请使用 "IDENTIFIER ""X"""

标识符去重

在某些情况下,可能会出现重复的标识符,例如在展开(unnest)嵌套数据结构时,列名可能会发生冲突。在这种情况下,DuckDB 会自动按以下规则重命名列名以进行去重:

  • 对于名为 name 的列,第一个实例不会被重命名。
  • 随后的实例将被重命名为 name_count,其中 count 从 1 开始。

例如

SELECT *
FROM (SELECT unnest({'a': 42, 'b': {'a': 88, 'b': 99}}, recursive := true));
a a_1 b
42 88 99

数据库名称

数据库名称需遵循标识符的相关规则。

此外,最佳实践是避免使用 DuckDB 的两个内部数据库模式名称systemtemp。默认情况下,持久化数据库的名称取自其文件名(不含扩展名)。因此,文件名 system.dbtemp.db(以及 system.duckdbtemp.duckdb)分别导致数据库名称为 systemtemp。如果您需要附加(attach)一个具有这些名称之一的数据库,请使用别名,例如:

ATTACH 'temp.db' AS temp2;
USE temp2;

大小写敏感性规则

关键字与函数名

在 DuckDB 中,SQL 关键字和函数名是不区分大小写的。

例如,以下两个查询是等效的:

select COS(Pi()) as CosineOfPi;
SELECT cos(pi()) AS CosineOfPi;
CosineOfPi
-1.0

标识符的大小写敏感性

与 PostgreSQL 类似,DuckDB 中的标识符始终是不区分大小写的。然而,与 PostgreSQL(及其他一些主流 SQL 实现)不同的是,DuckDB 将加引号的标识符也视为不区分大小写。

标识符比较:大小写不敏感是通过基于 ASCII 的比较实现的:col_Acol_a 相等,但 col_á 与它们不相等。

SELECT col_A FROM (SELECT 'x' AS col_a); -- succeeds
SELECT col_á FROM (SELECT 'x' AS col_a); -- fails

保留大小写:虽然 DuckDB 以不区分大小写的方式处理标识符,但它会保留这些标识符的大小写形式。也就是说,即使查询在引用标识符时使用了不同的大小写,每个字符的大小写(大写/小写)仍会按照用户最初指定的方式保存。例如:

CREATE TABLE tbl AS SELECT cos(pi()) AS CosineOfPi;
SELECT cosineofpi FROM tbl;
CosineOfPi
-1.0

要更改此行为,请将 preserve_identifier_case 配置选项设置为 false

嵌套数据结构中键的大小写敏感性

MAP 的键是区分大小写的。

SELECT MAP(['key1'], [1]) = MAP(['KEY1'], [1]) AS equal;
false

UNIONSTRUCT 的键是不区分大小写的。

SELECT {'key1': 1} = {'KEY1': 1} AS equal;
true
SELECT union_value(key1 := 1) = union_value(KEY1 := 1) as equal;
true

处理冲突

如果发生冲突,即同一个标识符以不同的大小写形式拼写,系统将随机选择其中一个。例如:

CREATE TABLE t1 (idfield INTEGER, x INTEGER);
CREATE TABLE t2 (IdField INTEGER, y INTEGER);
INSERT INTO t1 VALUES (1, 123);
INSERT INTO t2 VALUES (1, 456);
SELECT * FROM t1 NATURAL JOIN t2;
idfield x y
1 123 456

禁用大小写保留

preserve_identifier_case 配置选项设置为 false 时,所有标识符都会被转换为小写。

SET preserve_identifier_case = false;
CREATE TABLE tbl AS SELECT cos(pi()) AS CosineOfPi;
SELECT CosineOfPi FROM tbl;
cosineofpi
-1.0
© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南