0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[23c SQL新機能] SELECT文のdual表が不要になった!他のDBからの移行が簡略化

Posted at

環境

・Oracle Database 23c
 ※DBエディションやOSによって差異はなし

やれること

23cより前までは、OracleのSELECT文ではFROM句が必須でした。
そのため、たとえば現在日時を確認したいなど、表の必要のないSELECT文ではDUAL表という
ダミー表を使用して、SELECT文を成り立たせていました。

それが23cではDUAL表のためのFROM句が不要となりました。

長年Oracleを使ってきた自分には、なぜそんな改訂が行われたのか不思議に思っていましたが
どうも他のデータベースではFROM句不要でSELECTできるのが普通だったようです。
Oracleと他のデータベースの動きを確認してみました。

FROM句が必要ないようなシンプルSQLと、現在日時を取得するSQLを
データベースごとに比較

image.png

実行例

Oracle Database 23c

FROM句(Dual表指定)が不要になった

[oracle@host01 ~]$ sqlplus  / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Developer-Release on 日 10月 22 08:00:31 2023
Version 23.2.0.0.0

Copyright (c) 1982, 2023, Oracle.  All rights reserved.



Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release
Version 23.2.0.0.0
に接続されました。
SQL> select 1 from dual;

         1
----------
         1

SQL> select 1;

         1
----------
         1

SQL> select sysdate;

SYSDATE
--------
23-10-22

SQL>

Oracle Database 19c

Oracleでは21cまではFROM句必須(例は19c)

[oracle@sms-oracle-db-3s ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on 月 10月 16 09:54:30 2023
Version 19.11.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.



Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.11.0.0.0
に接続されました。
SQL> show user
ユーザーは"SYS"です。
SQL> select 1 from dual;

         1
----------
         1

★ 19cではFROM句が必須のため、エラーになる
SQL> select 1
  2  ;

*
行2でエラーが発生しました。:
ORA-00923: FROMキーワードが指定の位置にありません。


SQL> select sysdate from dual;

SYSDATE
--------
23-10-16

★ 19cではFROM句が必須のため、エラーになる
SQL> select sysdate;
select sysdate
             *
行1でエラーが発生しました。:
ORA-00923: FROMキーワードが指定の位置にありません。

SQL Server

SQL ServerではFROM句不要

C:\Users\Administrator>sqlcmd -S localhost -U sa
パスワード:

★SQL Serverでは dual表は存在しない
1> select 1 from dual;
2> go
メッセージ 208、レベル 16、状態 1、サーバー WIN-OGLJPPACQ1N、行 1
オブジェクト名 'dual' が無効です。
1>
2>
3>

★SQL Serverでは もともとdual表は不要で検索できた
4> select 1
5> go

-----------
          1

(1 行処理されました)

★SQL Serverでの現在日時を取得するSQL文
1> select getdate()
2> go

-----------------------
2023-10-16 13:18:12.820

(1 行処理されました)

PostgreSQL

PostgreSQLではFROM句不要

C:\Users\Administrator>psql -U postgres
ユーザ postgres のパスワード:
psql (13.4)
"help"でヘルプを表示します。

★PostgreSQLでは dual表は存在しない
postgres=# select 1 from dual;
ERROR:  リレーション"dual"は存在しません

行 1: select 1 from dual;
                    ^

★PostgreSQLでは もともとdual表は不要で検索できた
postgres=# select 1;
 ?column?
----------
        1
(1 行)

★PostgreSQLでの現在日時を取得するSQL文
postgres=# select now();
              now
-------------------------------
 2023-10-20 19:16:57.636296+09
(1 行)

postgres=# select current_date;
 current_date
--------------
 2023-10-20
(1 行)


0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?