DB

各DB上で0またはNULLによる徐算のSQL文を試してみた

今回は、Oracle・MySQL・PostgreSQL・SQL Serverの各データベース上で、0で除算した場合・NULLで除算した場合それぞれについて試してみることにした。
基本は、0で除算した場合はエラーで、NULL値で除算した場合はNULL値が返されるが、MySQLに限り、0で除算した場合はNULL値が返されることが確認できた。

前提条件

Windows端末上に、Oracle・MySQL・PostgreSQL・SQL Serverをそれぞれインストール済であること。

Oracle・MySQL・PostgreSQLのインストール手順は下記記事を参照のこと。

Windows端末にMySQL、PostgreSQL、Oracleをインストールしてみた今回はいろいろな種類のデータベースを使ってみたかったので、Windows端末に、MySQL、PostgreSQL、Oracleそれぞれの...

また、SQL Serverのインストール手順は下記記事を参照のこと。

SQL Serverのデータ分析を行う環境構築を行った(1)今回は、SQL Serverのデータ分析を行う環境構築として、SQL Server・SQL Server Management Stud...

やってみたこと

  1. Oracleの場合の実行結果
  2. MySQLの場合の実行結果
  3. PostgreSQLの場合の実行結果
  4. SQL Serverの場合の実行結果
  5. Javaプログラムによる実行結果

Oracleの場合の実行結果

1) 0で除算した場合、以下のようにエラーになる

select 1/0 as div_zero from dual
Oracle_0で除算

2) NULL値で除算した場合、以下のようにNULL値が返される

select 1/NULL as div_null from dual
Oracle_nullで除算

3) 0で除算しようとした場合に、0をNULL値に置き換えて除算した結果は以下の通り

select 
   work.A as A
   , DECODE(work.A, 0, NULL, work.A) as DEC_A
   , 1 / DECODE(work.A, 0, NULL, work.A) as DIV_A 
from work
Oracle_0をnullに置き換えて除算

なお、上記SQL文を実行する前に、workテーブルにカラムAを作成し、A=0,A=1のデータを追加しておくものとする。他のDBについても同様とする。



MySQLの場合の実行結果

1) 0で除算した場合、以下のようにNULL値が返される   ※他のDBと違うので要注意

select 1/0 as div_zero from dual
Mysql_0で除算

2) NULL値で除算した場合、以下のようにNULL値が返される

select 1/NULL as div_null from dual
MySQL_nullで除算

3) 0で除算しようとした場合に、0をNULL値に置き換えて除算した結果は以下の通り

select 
         work.A as A
       , if(work.A=0, NULL, work.A) as DEC_A
       , 1 / if(work.A=0, NULL, work.A) as DIV_A 
from world.work work
MySQL_0をnullに置き換えて除算



PostgreSQLの場合の実行結果

1) 0で除算した場合、以下のようにエラーになる

select 1/0 as div_zero
Postgresql_0で除算

2) NULL値で除算した場合、以下のようにNULL値が返される

select 1/null as div_null
Postgresql_nullで除算

3) 0で除算しようとした場合に、0をNULL値に置き換えて除算した結果は以下の通り

select 
         work.A as A
       , CASE work.A WHEN 0 THEN NULL ELSE work.A END as DEC_A
       , 1 / (CASE work.A WHEN 0 THEN NULL ELSE work.A END) as DIV_A 
from work
Postgresql_0をnullに置き換えて除算



SQL Serverの場合の実行結果

1) 0で除算した場合、以下のようにエラーになる

select 1/0 as div_zero
SQLServer_0で除算

2) NULL値で除算した場合、以下のようにNULL値が返される

select 1/null as div_null
SQLServer_nullで除算

3) 0で除算しようとした場合に、0をNULL値に置き換えて除算した結果は以下の通り

select 
        work.A as A
      , CASE work.A WHEN 0 THEN NULL ELSE work.A END as DEC_A
      , 1 / (CASE work.A WHEN 0 THEN NULL ELSE work.A END) as DIV_A 
from dbo.work as work
SQLServer_0をnullに置き換えて除算



Javaプログラムによる実行結果

Javaプログラムで0による除算、NULL値による除算を行うとどうなるかも気になったので実行してみた。結果、両方ともエラーになることが確認できた。

1) 0で除算した場合、以下のようにエラー(ArithmeticException)になる
Java_0で除算_プログラム
Java_0で除算_実行結果

2) NULL値で除算した場合、以下のようにエラー(NullPointerException)になる
Java_nullで除算_プログラム
Java_nullで除算_実行結果

なお、上記はJDK 1.8をインストール済の環境で実行している。