LoginSignup
3
3

More than 5 years have passed since last update.

SQL識別子を引用して謎っぽいSQLを書いてみる(PostgreSQL編)

Last updated at Posted at 2016-10-19

はじめに

今夜もまーったく役に立たないことを書いてみますよ。

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

おわりに

ね、役にたたなかったでしょ?

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3