SQL - разница между COALESCE и ISNULL?

Каковы практические различия между COALESCE() и ISNULL (, '')?

Если избегать значений NULL в конкатенациях SQL, какой из них лучше всего использовать?

Спасибо!

Ответ 1

Сравнение COALESCE и ISNULL

Функция ISNULL и выражение COALESCE имеют сходную цель, но могут вести себя по-разному.

  • Поскольку ISNULL является функцией, она оценивается только один раз. Как описано выше, входные значения для выражения COALESCE могут быть оценены несколькими раз.
  • Определение типа данных для полученного выражения другой. ISNULL использует тип данных первого параметра, COALESCE следует правилам выражения CASE и возвращает тип данных значения с наивысшим приоритетом.
  • NULLability выражения результата отличается для ISNULL и COALESCE. Возвращаемое значение ISNULL всегда считается NOT NULLable (при условии, что возвращаемое значение является non-nullable), тогда как 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

Ответ 2

Основное отличие состоит в том, что COALESCE является стандартом ANSI, поэтому вы также найдете его в других СУБД, другая разница заключается в том, что вы можете указать полный список значений, которые нужно проверить, на COALESCE, тогда как ISNULL вы можете передать только один.

Ответ 3

Поскольку ISNULL является функцией, она оценивается только один раз. Как описано выше, входные значения для выражения COALESCE могут быть оценены несколько раз. COALESCE основном преобразуется в выражение CASE а ISNULL - это встроенный механизм, реализованный в базе данных.

ISNULL быстрее, чем COALESCE.

MSDN

Ответ 4

COALESCE() может иметь несколько входов и будет оцениваться по порядку, пока один из них не будет пустым, например COALESCE(Col1, Col2, Col3, 'N/A'). Рекомендуется использовать это MS вместо ISNULL()

ISNULL() может иметь только один вход, однако было показано, что он немного быстрее, чем COALESCE.