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ägtSELECT 123 AS SELECTfehl. - Sie dürfen nicht mit einer Zahl oder einem Sonderzeichen beginnen, z. B. ist
SELECT 123 AS 1colungültig. - Sie dürfen keine Leerzeichen enthalten (einschließlich Tabulatoren und Zeilenumbrüchen).
- Sie dürfen kein reserviertes Schlüsselwort sein (siehe
- 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); -- succeedsSELECT col_á FROM (SELECT 'x' AS col_a); -- failsErhalten 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;falseDie Schlüssel von UNIONs und STRUCTs sind unabhängig von der Groß-/Kleinschreibung:
SELECT {'key1': 1} = {'KEY1': 1} AS equal;trueSELECT union_value(key1 := 1) = union_value(KEY1 := 1) as equal;trueUmgang 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 |