COALESCEとISNULLの比較
ISNULL関数とCOALESCE式の目的は似ていますが、動作が異なる場合があります。
- ISNULLは関数であるため、一度だけ評価されます。上記のように、COALESCE式の入力値は複数回評価できます。
- 結果の式のデータ型の決定は異なります。 ISNULLは、最初のパラメーターのデータ型を使用します。COALESCEは、CASE式の規則に従い、優先順位が最も高い値のデータ型を返します。
- 結果式のNULL可能性は、ISNULLとCOALESCEで異なります。 ISNULLの戻り値は常にNOTNULL可能と見なされます(戻り値がnull以外の値であると想定)が、null以外のパラメーターを持つCOALESCEはNULLと見なされます。したがって、式ISNULL(NULL、1)とCOALESCE(NULL、1)は、同等ではありますが、異なるnullability値を持っています。これは、これらの式を計算された列で使用する場合、キー制約を作成する場合、またはスカラーUDFの戻り値を決定論的にして、次の例に示すようにインデックスを付けることができる場合に違いがあります。
> USE tempdb;
> GO
> -- This statement fails because the PRIMARY KEY cannot accept NULL values
> -- and the nullability of the COALESCE expression for col2
> -- evaluates to NULL.
> CREATE TABLE #Demo ( col1 integer NULL, col2 AS COALESCE(col1, 0) PRIMARY KEY, col3 AS ISNULL(col1, 0) );
>
> -- This statement succeeds because the nullability of the
> -- ISNULL function evaluates AS NOT NULL.
>
> CREATE TABLE #Demo ( col1 integer NULL, col2 AS COALESCE(col1, 0),
> col3 AS ISNULL(col1, 0) PRIMARY KEY );
ISNULLとCOALESCEの検証も異なります。たとえば、ISNULLのNULL値はintに変換されますが、COALESCEの場合は、データ型を指定する必要があります。ISNULLは2つのパラメーターのみを取りますが、COALESCEは可変数のパラメーターを取ります。
出典:BOL