Porovnání COALESCE a ISNULL
Funkce ISNULL a výraz COALESCE mají podobný účel, ale mohou se chovat odlišně.
- Protože ISNULL je funkce, je vyhodnocena pouze jednou. Jak je popsáno výše, vstupní hodnoty pro výraz COALESCE lze vyhodnotit vícekrát.
- Určení datového typu výsledného výrazu je různé. ISNULL používá datový typ prvního parametru, COALESCE se řídí pravidly výrazu CASE a vrací datový typ hodnoty s nejvyšší prioritou.
- Možnost NULL výsledného výrazu se liší pro ISNULL a COALESCE. Návratová hodnota ISNULL je vždy považována za hodnotu NOT NULL (za předpokladu, že vrácená hodnota je bez možnosti Null), zatímco COALESCE s parametry bez hodnoty Null je považována za hodnotu NULL. Takže výrazy ISNULL(NULL, 1) a COALESCE(NULL, 1), ačkoli jsou ekvivalentní, mají různé hodnoty nullability. To je rozdíl, pokud používáte nepočítané sloupce s těmito výrazy, vytváříte klíčová omezení nebo děláte návratovou hodnotu skalárního UDF deterministickou, aby mohl být indexován, jak je ukázáno v následujícím příkladu.
> 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 );
Ověření pro ISNULL a COALESCE se také liší. Například hodnota NULL pro ISNULL se převede na int, zatímco pro COALESCE musíte zadat datový typ. ISNULL přebírá pouze 2 parametry, zatímco COALESCE přebírá proměnný počet parametrů.
Zdroj:BOL