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 не є 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
СЛУЧАЙ - Також стандартна скалярна функція ANSI. Я б розглядав використання CASE в порівнянні з попередніми двома, коли у мене є тест, який не можна виразити простим скаляром, але це, мабуть, досить слабка відповідь.
COALESCEрозширюється до,CASEале, очевидно, вCASEзаяві, яку ви самі пишете, ви можете бути більш гнучкими вWHENумовах. ДляISNULLпротиCOALESCEпов'язаних з / продублювати?