Ключевые слова и идентификаторы
Идентификаторы
Аналогично другим диалектам SQL и языкам программирования, идентификаторы в SQL DuckDB подчиняются нескольким правилам.
- Необрамлённые идентификаторы должны соответствовать ряду правил:
- Они не должны быть зарезервированным ключевым словом (см.
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, system и temp. По умолчанию постоянные базы данных именуются по имени файла без расширения. Поэтому, файлы system.db и temp.db (а также system.duckdb и temp.duckdb) приводят к именам баз данных system и temp соответственно. Если вам нужно подключиться к базе данных с одним из этих имён, используйте псевдоним, например:
ATTACH 'temp.db' AS temp2; USE temp2;
Правила для чувствительности к регистру
Ключевые слова и имена функций
Ключевые слова SQL и имена функций в DuckDB нечувствительны к регистру.
Например, следующие два запроса эквивалентны:
select COS(Pi()) as CosineOfPi; SELECT cos(pi()) AS CosineOfPi;
| CosineOfPi |
|---|
| -1.0 |
Чувствительность к регистру идентификаторов
Идентификаторы в DuckDB всегда нечувствительны к регистру, подобно PostgreSQL. Однако, в отличие от PostgreSQL (и некоторых других основных реализаций SQL), DuckDB также обрабатывает обрамлённые идентификаторы как нечувствительные к регистру.
Несмотря на то, что идентификаторы обрабатываются как нечувствительные к регистру, регистр каждого символа (заглавные/строчные буквы) сохраняется, как указано пользователем, даже если запрос использует различные регистры при ссылке на идентификатор. Например:
CREATE TABLE tbl AS SELECT cos(pi()) AS CosineOfPi; SELECT cosineofpi FROM tbl;
| CosineOfPi |
|---|
| -1.0 |
Чтобы изменить это поведение, установите параметр конфигурации preserve_identifier_case параметр конфигурации в false.
Обработка конфликтов
В случае конфликта, когда один и тот же идентификатор написан с разными регистрами, один из них будет выбран случайным образом. Например:
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 |
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/dialect/keywords_and_identifiers.html