Как вы знаете, null никогда не равен нулю в SQL.Альтернативное значение, отличное от нуля
Давайте представим, что у нас есть запрос, как это:
declare @LastName varchar(50) = 'Nixon';
select * from Users
where LastName = @LastName;
Если я хочу, чтобы позволить переменной быть пустым, я делаю это:
declare @LastName varchar(50) = 'Nixon';
select * from Users
where LastName = IsNull(@LastName, LastName);
Но что, если LastName равно нулю? Я должен сделать это:
declare @Null varchar(50) = '!{-[~]-}!'; -- any-ole gibberish
declare @LastName varchar(50) = 'Nixon';
select * from Users
where IsNull(LastName, @Null) = Coalesce(@LastName, LastName, @Null);
Это прекрасно работает, и я вижу много подобных подходов.
Но мой вопрос: это действительно лучший подход? Мне кажется, что это kludge, но я много думал об этом и просто не мог придумать ничего лучшего.
EDIT, но это, кажется, лучше всего:
declare @LastName varchar(50) = 'Nixon';
select * from Users
where (@LastName is null) or (@LastName = LastName);
Это не та же логика. Например, если @LastName не является нулевым, а LastName имеет значение null, ваша логика будет давать неожиданные результаты. Это связано с тем, что моя логика выше НЕ возвращает все результаты, если LastName имеет значение NULL. Не за что. –
Вы имеете в виду, возможно, второй запрос, который я только что добавил? –
Да, это правильная логика, но гораздо сложнее, чем мой образец. Я вижу, как это меньше. –