SQLServer ISNULLとCOALESCEはどう違うのか

2017.10.14

NULLを何か別の値に置き換えたいとき、ISNULLを使う方法と、COALESCEを使う方法がありますが、どちらを使うのが良いか考えてみたいと思います。

ISNULLはどういう動きなのか

ISNULL ( check_expression , replacement_value )

戻り値の型:replacement_valueを暗黙の型変換で、check_expression と同じ型に変換して返す。

COALESCEはどういう動きなのか

COALESCE ( expression [ ,...n ] ) 

戻り値の型:expression のデータ型のうち、最も優先順位が高いものを返します。

ISNULLとCOALESCEの違い

isnullのときは下記のようなSQLならエラーになりません。

select
    isnull(col,0)
from (
    select '0' as col
    union all
    select 'a' as col
) tx

しかし、数字型のデータを含めるとエラーになります。

select
    isnull(col,0)
from (
    select '0' as col
    union all
    select 'a' as col
    union all
    select 0 as col
) tx

次にcoalesce()を使った場合ですが、aをintに変換できないためエラーになります。

select
    coalesce(col,0)
from (
    select '0' as col
    union all
    select 'a' as col
) tx

まとめ

結論になりますが、ISNULLかCOALESCEのどちらを使おうか迷ったら、より型に厳しいCOALESCEを使いましょう。

この方が、カラムに格納されているデータが何なのか意識せず、カラムの型だけを意識して対応すればよいので、 運用が始まって格納されているデータの想定が崩れてダメージを受けるようなことを防げるのではないでしょうか。