Сравняване на COALESCE и ISNULL
Функцията ISNULL и изразът COALESCE имат сходно предназначение, но могат да се държат различно.
- Тъй като ISNULL е функция, тя се оценява само веднъж. Както е описано по-горе, входните стойности за израза COALESCE могат да бъдат оценени многократно.
- Определянето на типа данни на резултантния израз е различно. ISNULL използва типа данни на първия параметър, COALESCE следва правилата за израза CASE и връща типа данни стойност с най-висок приоритет.
- Възможността на NULL на резултатния израз е различна за ISNULL и COALESCE. Връщаната стойност ISNULL винаги се счита, че НЕ НУЛЕВА (ако се приеме, че връщаната стойност е без нула), докато COALESCE с ненулеви параметри се счита за NULL. Така че изразите ISNULL(NULL, 1) и COALESCE(NULL, 1), въпреки че са еквивалентни, имат различни стойности за нула. Това прави разлика, ако използвате тези изрази в изчислени колони, създавате ключови ограничения или правите връщаната стойност на скаларен 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 също са различни. Например, стойност NULL за ISNULL се преобразува в int, докато за COALESCE трябва да предоставите тип данни. ISNULL приема само 2 параметъра, докато COALESCE приема променлив брой параметри.
Източник:BOL