[SQL]SQLでHello, world?

2016年9月5日月曜日

SQL

SQLでHello, world.って言ったら、すぐに思いつくのはこんな感じだろうか。

SELECT 'Hello, world.';

いくつかのDBMSではこれでうまくいく。
でも、OracleだとFROM句がないとおこられちゃうよね。

> SELECT 'Hello, world.';
ORA-00923: FROM keyword not found where expected

Oracleではこういう時、DUAL表を使う。

> SELECT 'Hello, world.' FROM DUAL;

うーん、なんでDUAL表なんて使わなくちゃいけないんだろう。。。FROM句省略できたっていいじゃんって、思ってたんだよね。

ところが、そうじゃなかった。標準SQLではSELECT文にはFROM句は必須なんだ。
例えば、PostgreSQLのドキュメントにはFROM句の省略は拡張構文だよ、って書いてある。

PostgreSQL 9.5.3文書 SQLコマンド SELECT
https://www.postgresql.jp/document/9.5/html/sql-select.html
「FROM句の省略」は下の方の「互換性」に記載されている。

確かに考えてみれば、SELECT文はインプットもアウトプットも表なんだから、FROM句なしで結果が1行返ってくるってのは理屈に合わないよね。
無から有が生み出されることになってしまう。

じゃあ、標準SQLで Hello world. したかったら、どうすればいいんだろう。
再び、PostgreSQLのドキュメントを見てみよう。

PostgreSQL 9.5.3文書 SQLコマンド VALUES
https://www.postgresql.jp/document/9.5/html/sql-values.html
大きなコマンドの中において、 SELECT が文法上使える場所ならどこでもVALUESを使用することができます。

そうか、VALUESを使うのか。
というわけで、こうなる。

VALUES('Hello, world.');

VALUESってINSERT文の中だけじゃなくって、単独でも使っていいんだね。

でも、逆にOracleではこの単独のVALUESが使えないんだよね。
SQLでHello world.なんて簡単だって思ったけど、なかなかどうして、標準SQLってのは一筋縄ではいかないですねぇ。

参考:
Modern SQL select without from
https://modern-sql.com/use-case/select-without-from