⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
关键词和标识符

标识符

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

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

标识符去重

在某些情况下,可能会出现重复的标识符,例如,当展开嵌套数据结构时,列名可能会冲突。在这些情况下,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 'temp.db' AS temp2;
USE temp2;

大小写敏感规则

关键字和函数名称

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

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

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

标识符的大小写敏感性

DuckDB 中的标识符始终不区分大小写,这与 PostgreSQL 类似。然而,与 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