Для чего это стоит У вас есть очень конкретный вариант использования, поэтому я использовал пример вашего фактического вопроса на первом значении в таблице, которая пришла в голову и контролировал скрипт для других переменных. Я предположил, что someval был int как вы использовали 0. Я предлагаю вам выбрать конкретный случай someval / sometable и выполнить тест самостоятельно.
declare @val int = 0;
declare @time1 Datetime2 = getdate();
declare @time2 Datetime2 = getdate();
Select @time1 = GETDATE();
while @MyCounter < 1000000
Begin
Select @val = ISNULL((SELECT TOP 1 LocationID FROM location), 0)
Select @MyCounter +=1;
END
Select @time2 = GETDATE();
Print datediff(millisecond,@time1,@time2);
Select @MyCounter = 0;
Select @time1 = GETDATE();
while @MyCounter < 1000000
Begin
Select @val = COALESCE((SELECT TOP 1 LocationID FROM Location), 0)
Select @MyCounter +=1;
END
Select @time2 = GETDATE();
Print datediff(millisecond,@time1,@time2);
Результаты были довольно впечатляющими: 11270 для isnull и 18930 для объединения. Изменение порядка петель в качестве второго теста дало 18260 для объединения и 10810 для полного. Для вашего конкретного случая я бы сказал, что isnull явно быстрее.
Нельзя сказать, что лучше в любой другой данной ситуации. Использование прямых значений или nvarchars или битов вместо int, или столбца, который не является первичным ключом, или Nesting isnull вместо добавления параметров в coalesce может изменить ситуацию.
Это касается только того вопроса, который был задан.