Porównanie COALESCE i ISNULL
Funkcja ISNULL i wyrażenie COALESCE mają podobny cel, ale mogą zachowywać się inaczej.
- Ponieważ ISNULL jest funkcją, jest oceniany tylko raz. Jak opisano powyżej, wartości wejściowe wyrażenia COALESCE mogą być oceniane wielokrotnie.
- Określenie typu danych wynikowego wyrażenia jest inne. ISNULL używa typu danych pierwszego parametru, COALESCE przestrzega reguł wyrażenia CASE i zwraca typ danych value o najwyższym priorytecie.
- Prawność NULL wyrażenia wyniku jest inna dla ISNULL i COALESCE. Wartość zwracana ISNULL jest zawsze uważana za NIE NULL (przy założeniu, że wartość zwracana jest wartością nie dopuszczającą wartości NULL), podczas gdy COALESCE z parametrami innymi niż NULL jest uważana za NULL. Zatem wyrażenia ISNULL(NULL, 1) i COALESCE(NULL, 1), chociaż są równoważne, mają różne wartości dopuszczalności wartości null. Ma to znaczenie, jeśli używasz tych wyrażeń z nieobliczonymi kolumnami, tworząc ograniczenia kluczowe lub sprawiając, że zwracana wartość skalarnego UDF jest deterministyczna, aby mogła być indeksowana, jak pokazano w poniższym przykładzie.
> 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 );
Walidacje dla ISNULL i COALESCE są również różne. Na przykład wartość NULL dla ISNULL jest konwertowana na int, podczas gdy dla COALESCE, musisz podać typ danych. ISNULL przyjmuje tylko 2 parametry, podczas gdy COALESCE przyjmuje zmienną liczbę parametrów.
Źródło:BOL