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 を使いましょう。

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