SQLで安全に除算を行なう

本日は軽い話題。

SQLで除算を行なう時に困るのは、ゼロ除算の扱いだ。通常のプログラミング言語ならともかく、集計・分析をメインとするSQLにおいては、ゼロ除算はNULLあるいは0になってくれれば問題ない場合が多く、ゼロ除算エラーが発生してしまうのは、単に面倒なことが多い。

大昔のOracleであれば、DECODE関数を使うのが一般的だったが、現在ではANSI標準のNULLIF関数を使うことで回避できる(というより、この用途意外でNULLIFって使い道あるんだろうか……)。この関数を使うメリットは、分母を2回書く必要がないことだ。

-- 従来ならこう書いていた
SELECT DECODE(分母, 0, NULL, 分子 / 分母) FROM 消費税マスタ

-- 最近ならこう書ける
SELECT 分子 / NULLIF(分母, 0) FROM 消費税マスタ

別の方法として100分率を求める分析関数の RATIO_TO_REPORT を使う手もある。この関数を使った場合は、分母が0の場合、結果も0になる。