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
пов'язаних з / продублювати?