ISNULL - доступно только в SQL Server. Позволяет тестировать и заменять значение NULL на другое.
COALESCE - стандарт ANSI. Позволяет тестировать и заменять значение NULL на первое ненулевое значение в наборе аргументов переменной длины. Важно отметить, что приоритетность типов данных в этом
-- Conversion failed when converting the varchar value 'a' to data type int
SELECT COALESCE(CAST(NULL AS varchar(10)), 'a', 1)
-- Returns 1
SELECT COALESCE(CAST(NULL AS varchar(10)), 1, 'a')
В приведенном выше примере «a» является первым ненулевым значением, но символьные данные имеют более низкий приоритет, чем целое число.
Другое соображение между ISNULL и COALESCE заключается в том, что результирующий ISNULL определен как NOT NULL, а результат вызова COALESCE - NULLable. См. Сообщение JRJ ISNULL () <> COALESCE (). Хотя это может показаться тривиальным, оптимизатор запросов может строить разные планы на основе обнуляемости столбца.
Вы можете легко проверить обнуляемость ваших выражений isnull / coalesce / case, запустив его через dmo sys.dm_exec_describe_first_result_set
-- these all evaluate to not nullable (is_nullable = 0) because I'm not clever enough
DECLARE @sql nvarchar(4000) = N'
SELECT ISNULL(NULL, 1) AS I
, COALESCE(NULL, 1) AS C
, CASE WHEN NULL = NULL THEN NULL ELSE 1 END AS C1
'
SELECT
DMO.*
FROM
sys.dm_exec_describe_first_result_set(@sql, NULL, 0) AS DMO
CASE - также стандартная скалярная функция ANSI. Я бы посмотрел на использование CASE поверх двух предыдущих, когда у меня есть тест, который не может быть выражен простым скаляром, но это довольно слабый ответ, я признаю.
COALESCEрасширена до,CASEно, очевидно, вCASEзаявлении, которое вы пишете самостоятельно, вы можете быть более гибкими вWHENусловиях. ДляISNULLпротивCOALESCEсвязанных с / продублировать?