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