Як зауважив Марк, вам потрібно буде важко знайти відмінності в продуктивності; Я думаю, інші фактори будуть важливішими. Для мене я завжди використовую COALESCE, і більшість з цього ви вже згадували ви або Марк:
- COALESCE - стандарт ANSI. Це одна річ, про яку я повинен переживати, якщо я збираюся перенести свій код. Для мене особисто це не так важливо, тому що я знаю, як рідко такі порти насправді трапляються за межами світу аудиторії Челко, але для деяких людей це користь.
- На противагу тому, що ви сказали про читабельність, я вважаю, що це важче читати ISNULL, особливо для користувачів, які приходять з інших мов або платформ, де ISNULL повертає булева (яка не існує в SQL Server). Зрозуміло, що COALESCE важче написати, але, принаймні, це не призводить до неправильних припущень.
- COALESCE набагато гнучкіший, як я можу сказати, COALESCE (a, b, c, d), тоді як з ISNULL я повинен був би зробити багато вкладених, щоб досягти того ж самого.
Ви також повинні бути впевнені, що знаєте, як керується пріоритетом типу даних за допомогою двох функцій, якщо ви використовуєте їх з різними типами / точними даними тощо.
Примітка
Є один виняток. У поточних версіях SQL Server вони обробляються по-різному:
SELECT COALESCE((SELECT some_aggregate_query),0);
SELECT ISNULL((SELECT some_aggregate_query),0);
COALESCE
Варіант буде на самому ділі виконати some_aggregate_query
двічі (один раз для перевірки значення, і один раз , щоб повернутися, коли ненульовий), а ISNULL
тільки виконати підзапит один раз. Я говорю про кілька інших відмінностей тут:
COALESCE
оцінюється двічі.