佐々木屋

技術的なことから趣味まで色々書きます

NULLを考える②(COALESCE関数)

前回NULLの扱いで、NULLIF関数の話をしました。
これを使うと簡単に0除算エラーの対策が可能になります。

SELECT col_a / NULLIF(col_b, 0) 
FROM SomeTable

演算でNULLが来た場合はNULLを返す仕様をそのまま利用する形です。

基本形はこれだけど、これだと結果が NULLが返ります。C#であればそのまま結果NULLを自作関数に入れて数値等へ変換しちゃう場合が多いですが、NULL許容ではない場合だと少し不便ですよね。そうすると、NULLの場合の条件分岐が必要なので、以下のように長くなってしまいます。

SELECT CASE col_b WHEN 0 THEN 0 ELSE col_a / col_b END
FROM SomeTable

この場合、COALESCE 関数とNULLIF関数を併用すると簡単に解決します。
COALESCE 関数は、与えられた引数で最初に見つけたNULL以外の引数を返します。つまり、以下の場合は「3」が返ります。

SELECT COALESCE(NULL,NULL,3)

つまり、以下のように簡単になるわけです。

    -- col_bが0の場合、0になる
    -- COALESCE関数の第二引数を変更することで、-1とかにもできる
SELECT COALESCE(col_a / NULLIF(col_b, 0), 0)
FROM SomeTable


何かの比率を求める、ってのはよくあることなので、この手法は結構使う形ですので覚えておくと良いでしょう。