今回は、Oracle・MySQL・PostgreSQL・SQL Serverの各データベース上で、0で除算した場合・NULLで除算した場合それぞれについて試してみることにした。
基本は、0で除算した場合はエラーで、NULL値で除算した場合はNULL値が返されるが、MySQLに限り、0で除算した場合はNULL値が返されることが確認できた。
前提条件
Windows端末上に、Oracle・MySQL・PostgreSQL・SQL Serverをそれぞれインストール済であること。
Oracle・MySQL・PostgreSQLのインストール手順は下記記事を参照のこと。
また、SQL Serverのインストール手順は下記記事を参照のこと。
やってみたこと
Oracleの場合の実行結果
1) 0で除算した場合、以下のようにエラーになる
1 | select 1/0 as div_zero from dual |
2) NULL値で除算した場合、以下のようにNULL値が返される
1 | select 1/NULL as div_null from dual |
3) 0で除算しようとした場合に、0をNULL値に置き換えて除算した結果は以下の通り
1 2 3 4 5 | 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 |
なお、上記SQL文を実行する前に、workテーブルにカラムAを作成し、A=0,A=1のデータを追加しておくものとする。他のDBについても同様とする。
MySQLの場合の実行結果
1) 0で除算した場合、以下のようにNULL値が返される ※他のDBと違うので要注意
1 | select 1/0 as div_zero from dual |
2) NULL値で除算した場合、以下のようにNULL値が返される
1 | select 1/NULL as div_null from dual |
3) 0で除算しようとした場合に、0をNULL値に置き換えて除算した結果は以下の通り
1 2 3 4 5 | 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 |
PostgreSQLの場合の実行結果
1) 0で除算した場合、以下のようにエラーになる
1 | select 1/0 as div_zero |
2) NULL値で除算した場合、以下のようにNULL値が返される
1 | select 1/null as div_null |
3) 0で除算しようとした場合に、0をNULL値に置き換えて除算した結果は以下の通り
1 2 3 4 5 | 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 |
SQL Serverの場合の実行結果
1) 0で除算した場合、以下のようにエラーになる
1 | select 1/0 as div_zero |
2) NULL値で除算した場合、以下のようにNULL値が返される
1 | select 1/null as div_null |
3) 0で除算しようとした場合に、0をNULL値に置き換えて除算した結果は以下の通り
1 2 3 4 5 | 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 |
Javaプログラムによる実行結果
Javaプログラムで0による除算、NULL値による除算を行うとどうなるかも気になったので実行してみた。結果、両方ともエラーになることが確認できた。
1) 0で除算した場合、以下のようにエラー(ArithmeticException)になる
2) NULL値で除算した場合、以下のようにエラー(NullPointerException)になる
なお、上記はJDK 1.8をインストール済の環境で実行している。