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になる。