випадок проти нуля проти злиття


9

Я тільки читаю документацію до іспитів на SQL Server 2012 і побачив наступний момент:

випадок проти нуля проти злиття

Тепер я знаю, ЯК використовувати кожен, але я не знаю, КОГО використовувати кожен. Прошу уточнити, будь-хто. Дякую.

Пс. Будь ласка, чи можемо ми мати тег для екзаменаційних питань?


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 не є 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. Ще раз дякую
Стюарт Блеклер

1
CASEтехнічно це вираз, а не функція.
ypercubeᵀᴹ

1

ISNULL дає вам можливість повернути 1 повторний засіб, COALESCE не обмежується одним значенням, наприклад, COALESCE(v1,v2,v3,v4,v5) якщо V5 є єдиним значенням, яке НЕ НУЛЬТЕ, воно буде повернене

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.