データベース - SQL 関数 - 仮想テーブル DUAL
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」は、なんじゃこらと怒られていますが、結果は得られます。 物理的に何も使わないし、構文も短くなるし、こっちの方がスマートと思うのは、ワタクシだけ?
「DUAL表 - Wikipedia」 「SQLServer でダミーテーブルを使ってみる」 「PostgreSQL dual がないので代替策」
SYSDATE や USER など、表を適用せずとも値を返す演算に対して SELECT を行う場合に使われる。
SELECT 1+1 FROM DUAL; SELECT SYSDATE FROM DUAL; SELECT USER FROM DUAL;
SQL> SELECT * FROM DUAL; DUMMY ----- X
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 行)