случай против isnull против слияния

9

Я просто читаю документацию к экзаменам по SQL Server 2012 и вижу следующее:

случай против isnull против слияния

Теперь я знаю, КАК использовать каждый, но я не знаю, КОГДА использовать каждый. Пожалуйста, могли бы некоторые тела уточнить. Спасибо.

Ps. Пожалуйста, могли бы мы иметь тег для вопросов экзамена?

Стюарт Блэклер
источник
2
COALESCEрасширена до, CASEно, очевидно, в CASEзаявлении, которое вы пишете самостоятельно, вы можете быть более гибкими в WHENусловиях. Для ISNULLпротив COALESCE связанных с / продублировать?
Мартин Смит
связанные я согласен. но не дуп. Спасибо за комментарий :)
Стюарт Блэклер

Ответы:

10

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 поверх двух предыдущих, когда у меня есть тест, который не может быть выражен простым скаляром, но это довольно слабый ответ, я признаю.

billinkc
источник
Спасибо за полный ответ так быстро. Я понятия не имел, что порядок приоритета имеет значение для COALESCE. Еще раз спасибо
Стюарт Блэклер
1
CASEтехнически это выражение, а не функция.
ypercubeᵀᴹ
1

ISNULL дает вам возможность вернуть 1 ответ, COALESCE не ограничен одним значением, например, COALESCE(v1,v2,v3,v4,v5) если V5 - единственное значение, которое не равно NULL, оно будет возвращено

bummi
источник