データベース - SQL 関数 - 仮想テーブル DUAL

クラウディア 
1. 概要
2. DUAL
3. PostgreSQL

1. 概要

 例えば、「SYSDATE」のような値を単品で取得したいとき、「FROM」に対応するテーブルがない場合に仮想テーブルとして「DUAL」を使用します。  本ページは、下記のサイトを参考にさせていただきました。
DUAL表 - Wikipedia」
「SQLServer でダミーテーブルを使ってみる」
「PostgreSQL dual がないので代替策

2. DUAL

 これは、ウィキペディアの説明がわかりやすいですね。  引用すると
SYSDATE や USER など、表を適用せずとも値を返す演算に対して SELECT を行う場合に使われる。
 ちょっとびっくりなのは、「この表にはVARCHAR2(1)のDUMMYという列だけがあり、1件だけあるレコードの値は'X'となっている。」ということで、物理的に存在しているのだわ。  例題もわかりやすいので、そのまま引用します。

SELECT 1+1 FROM DUAL;
SELECT SYSDATE FROM DUAL;
SELECT USER FROM DUAL;
 なるほど、ではあります。  実際に、「DUAL」は、あるのか?と「DB2」(これも「DUAL」が使える)の「clpplus」で試してみましたら。

SQL> SELECT * FROM DUAL;

DUMMY
-----
X
 なるほど、本当だわ。

3. PostgreSQL

 「PostgreSQL」には、「DUAL」はないのです。  では、何を使うかちゅうと、何も使わなくていいのです。  「psql」でやってみます。

hogehoge=# SELECT 1+1;
 ?column?
----------
        2
(1 行)

hogehoge=# SELECT CURRENT_TIME;
    current_time
--------------------
 09:29:36.301364+09
(1 行)

hogehoge=# SELECT USER;
   user
----------
 fugafuga
(1 行)
 「1+1」は、なんじゃこらと怒られていますが、結果は得られます。  物理的に何も使わないし、構文も短くなるし、こっちの方がスマートと思うのは、ワタクシだけ?