Zum Inhalt springen

Schlüsselwörter und Bezeichner

Bezeichner

Ähnlich wie in anderen SQL-Dialekten und Programmiersprachen unterliegen Bezeichner in DuckDBs SQL mehreren Regeln.

  • Unquotierte Bezeichner müssen eine Reihe von Regeln erfüllen:
    • Sie dürfen kein reserviertes Schlüsselwort sein (siehe duckdb_keywords()), z. B. schlägt SELECT 123 AS SELECT fehl.
    • Sie dürfen nicht mit einer Zahl oder einem Sonderzeichen beginnen, z. B. ist SELECT 123 AS 1col ungültig.
    • Sie dürfen keine Leerzeichen enthalten (einschließlich Tabulatoren und Zeilenumbrüchen).
  • Bezeichner können mit doppelten Anführungszeichen (") quotiert werden. Quotierte Bezeichner dürfen beliebige Schlüsselwörter, Leerzeichen oder Sonderzeichen verwenden, z. B. sind "SELECT" und " § 🦆 ¶ " gültige Bezeichner.
  • Doppelte Anführungszeichen können durch Wiederholen des Anführungszeichens maskiert werden, z. B. erzeugen Sie den Bezeichner IDENTIFIER "X" mit "IDENTIFIER ""X""".

Deduplizieren von Bezeichnern

In manchen Fällen können doppelte Bezeichner auftreten, z. B. können Spaltennamen beim Entschachteln einer verschachtelten Datenstruktur kollidieren. In diesen Fällen dedupliziert DuckDB Spaltennamen automatisch, indem es sie nach folgenden Regeln umbenennt:

  • Bei einer Spalte namens ⟨name⟩{:.language-sql .highlight} bleibt die erste Instanz unverändert.
  • Weitere Instanzen werden in ⟨name⟩_⟨count⟩{:.language-sql .highlight} umbenannt, wobei ⟨count⟩{:.language-sql .highlight} bei 1 beginnt.

Zum Beispiel:

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

Datenbanknamen

Datenbanknamen unterliegen den Regeln für Bezeichner.

Zusätzlich ist es empfehlenswert, DuckDBs zwei interne Datenbankschemanamen system und temp zu vermeiden. Standardmäßig werden persistente Datenbanken nach ihrem Dateinamen ohne Erweiterung benannt. Daher führen die Dateinamen system.db und temp.db (sowie system.duckdb und temp.duckdb) zu den Datenbanknamen system bzw. temp. Wenn Sie eine Datenbank mit einem dieser Namen anbinden müssen, verwenden Sie einen Alias, z. B.:

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

Regeln zur Groß-/Kleinschreibung

Schlüsselwörter und Funktionsnamen

SQL-Schlüsselwörter und Funktionsnamen sind in DuckDB unabhängig von der Groß-/Kleinschreibung.

Die folgenden beiden Abfragen sind beispielsweise gleichwertig:

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

Groß-/Kleinschreibung von Bezeichnern

Bezeichner in DuckDB sind immer unabhängig von der Groß-/Kleinschreibung, ähnlich wie in PostgreSQL. Im Gegensatz zu PostgreSQL (und einigen anderen großen SQL-Implementierungen) behandelt DuckDB jedoch auch quotierte Bezeichner unabhängig von der Groß-/Kleinschreibung.

Vergleich von Bezeichnern: Die Unabhängigkeit von der Groß-/Kleinschreibung wird über einen ASCII-basierten Vergleich umgesetzt: col_A und col_a sind gleich, col_á ist ihnen jedoch nicht gleich.

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

Erhalten der Schreibweise: Obwohl DuckDB Bezeichner unabhängig von der Groß-/Kleinschreibung behandelt, bleibt die ursprüngliche Schreibweise erhalten. Das heißt, die Groß-/Kleinschreibung jedes Zeichens wird so beibehalten, wie sie ursprünglich angegeben wurde, auch wenn eine Abfrage den Bezeichner in anderer Schreibweise referenziert. Zum Beispiel:

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

Um dieses Verhalten zu ändern, setzen Sie die Konfigurationsoption preserve_identifier_case auf false.

Groß-/Kleinschreibung von Schlüsseln in verschachtelten Datenstrukturen

Die Schlüssel von MAPs sind abhängig von der Groß-/Kleinschreibung:

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

Die Schlüssel von UNIONs und STRUCTs sind unabhängig von der Groß-/Kleinschreibung:

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

Umgang mit Konflikten

Bei einem Konflikt, wenn derselbe Bezeichner mit unterschiedlicher Groß-/Kleinschreibung geschrieben wird, wird einer zufällig ausgewählt. Zum Beispiel:

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

Erhalten der Schreibweise deaktivieren

Mit der auf false gesetzten Konfigurationsoption preserve_identifier_case werden alle Bezeichner in Kleinbuchstaben umgewandelt:

SET preserve_identifier_case = false;
CREATE TABLE tbl AS SELECT cos(pi()) AS CosineOfPi;
SELECT CosineOfPi FROM tbl;
cosineofpi
-1.0