Каковы практические различия между COALESCE() и ISNULL (, '')?
Если избегать значений NULL в конкатенациях SQL, какой из них лучше всего использовать?
Спасибо!
Каковы практические различия между COALESCE() и ISNULL (, '')?
Если избегать значений NULL в конкатенациях SQL, какой из них лучше всего использовать?
Спасибо!
Сравнение 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
Основное отличие состоит в том, что COALESCE
является стандартом ANSI, поэтому вы также найдете его в других СУБД, другая разница заключается в том, что вы можете указать полный список значений, которые нужно проверить, на COALESCE
, тогда как ISNULL
вы можете передать только один.
Поскольку ISNULL
является функцией, она оценивается только один раз. Как описано выше, входные значения для выражения COALESCE
могут быть оценены несколько раз. COALESCE
основном преобразуется в выражение CASE
а ISNULL
- это встроенный механизм, реализованный в базе данных.
ISNULL
быстрее, чем COALESCE
.
COALESCE()
может иметь несколько входов и будет оцениваться по порядку, пока один из них не будет пустым, например COALESCE(Col1, Col2, Col3, 'N/A')
. Рекомендуется использовать это MS вместо ISNULL()
ISNULL()
может иметь только один вход, однако было показано, что он немного быстрее, чем COALESCE.