はじめに
Oracle Database 23cでは、SQLがシンプルに書けるような変更が加えられています。
地味ですがちょっと嬉しい変更を試してみました。
PostgreSQLとOracleの両方を使っている方、PostgreSQLからの移行を検討されている方向けにも助かる変更かと思います。
1. FROM dual 句なしのSELECT文が利用可能に
これまでは、定数や計算式、sysdate等の関数、シーケンスの順序疑似列などをSELECT文で取得する際にはFROM dual句が必要でしたが、Oracle Databse 23cではFROM dual句なしでも実行が可能になりました。
19c
SQL> SELECT sysdate FROM dual;
SYSDATE
-------------------
2023/04/22 07:03:29
SQL> SELECT sysdate;
SELECT sysdate
*
行1でエラーが発生しました。:
ORA-00923: FROMキーワードが指定の位置にありません。
SQL> CREATE SEQUENCE seq1;
順序が作成されました。
SQL> SELECT seq1.nextval FROM dual;
NEXTVAL
----------
1
SQL> SELECT seq1.nextval;
SELECT seq1.nextval
*
行1でエラーが発生しました。:
ORA-00923: FROMキーワードが指定の位置にありません。
SQL>
23c
SQL> SELECT sysdate FROM dual;
SYSDATE
-------------------
2023/04/22 07:04:33
SQL> SELECT sysdate;
SYSDATE
-------------------
2023/04/22 07:04:34
SQL> CREATE SEQUENCE seq1;
順序が作成されました。
SQL> SELECT seq1.nextval FROM dual;
NEXTVAL
----------
1
SQL> SELECT seq1.nextval;
NEXTVAL
----------
2
SQL>
2. GROUP BY 句で列の別名が利用可能に
これまではGROUP BY句で列の別名を使用することができませんでしたが、23cではGROUP BY句で列の別名が使用できるようになりました。
19c
SQL> SELECT LOWER(a.tablespace_name) ts, SUM(b.bytes)/1024/1024 mb
2 FROM dba_tablespaces a, dba_data_files b
3 WHERE a.tablespace_name = b.tablespace_name
4 GROUP BY LOWER(a.tablespace_name)
5 ORDER BY mb DESC;
TS MB
------------------------------ ----------
sampleschema 204800
sysaux 3505.25
undotbs1 1195
data 1124
system 1061
dbfs_data 100
undo_7 95.375
7行が選択されました。
SQL> SELECT LOWER(a.tablespace_name) ts, SUM(b.bytes)/1024/1024 mb
2 FROM dba_tablespaces a, dba_data_files b
3 WHERE a.tablespace_name = b.tablespace_name
4 GROUP BY ts
5 ORDER BY mb DESC;
GROUP BY ts
*
行4でエラーが発生しました。:
ORA-00904: "TS": 無効な識別子です。
SQL>
23cでは、GROUP BY句で列の別名(ここではts)が使用できるようになりました。
23c
SQL> SELECT LOWER(a.tablespace_name) ts, SUM(b.bytes)/1024/1024 mb
2 FROM dba_tablespaces a, dba_data_files b
3 WHERE a.tablespace_name = b.tablespace_name
4 GROUP BY LOWER(a.tablespace_name)
5 ORDER BY mb DESC;
TS MB
------------------------------ ----------
sysaux 340
system 290
undotbs1 100
users 5
SQL> SELECT LOWER(a.tablespace_name) ts, SUM(b.bytes)/1024/1024 mb
2 FROM dba_tablespaces a, dba_data_files b
3 WHERE a.tablespace_name = b.tablespace_name
4 GROUP BY ts
5 ORDER BY mb DESC;
TS MB
------------------------------ ----------
sysaux 340
system 290
undotbs1 100
users 5
SQL>