はじめに
今夜もまーったく役に立たないことを書いてみますよ。
SQL識別子の引用
PostgreSQLは(というか、他のDBMSでもそうだと思うけど)、SQL識別子は二重引用符で引用することで、ほぼ文字の制約なく記述することができる。
そう、空白文字から構成されるテーブル名、型名(ドメイン名)、テーブル名もね。
やってみた
今回は以下のSQL識別子を弄ってみた。
- ドメイン名
- テーブル名
- 列名
ドメイン定義
まず、text型を基底とする2つのドメインを以下の名前で定義した。
test=# CREATE DOMAIN " " AS text NOT NULL;
CREATE DOMAIN
test=# CREATE DOMAIN " " AS text NOT NULL;
CREATE DOMAIN
最初のドメイン名は半角空白2文字、2番目のドメイン名は全角空白1文字です。
今回はやらなかったけど、CREATE TYPE
を使って型定義をやっても同じようにできると思う。
テーブル定義
test=# CREATE TABLE " " (" " " ", " " " ");
CREATE TABLE
上で定義したドメイン名を列の型名として定義する。もちろん、列名も空白にする。
- 最初の列名は半角空白2文字
- 2番目の列名は全角空白1文字
なお、どういうわけか、表名とドメイン名(型名)は同一の名前空間(?)に属するためか、上で定義したドメイン名を表名に使おうとすると怒られる(´・ω・`)
test=# CREATE TABLE " " (id int);
ERROR: type " " already exists
HINT: A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type.
データ挿入
test=# INSERT INTO " " (" ", " ") VALUES (' ', ' ');
INSERT 0 1
データ挿入のためにINSERT文を使う。
- 最初の列名は半角空白2文字
- 2番目の列名は全角空白1文字
- 最初の値は半角空白2文字
- 2番目の値は全角空白1文字
\d コマンドでテーブル定義を確認
test=# \d " "
Table "public. "
Column | Type | Modifiers
--------+------+-----------
| " " |
| " " |
SELECTで検索
ただ、SELECTするだけじゃ面白くないので、各SELECT句を定義したドメインでキャストしてみた。
test=# SELECT " "::" ", " "::" " FROM " ";
|
----+----
|
(1 row)
うん。SQLも結果もわけがわからないねw
おわりに
ね、役にたたなかったでしょ?