2011-08-19 4 views
1

Как вы знаете, 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); 

ответ

2

Не было бы проще сделать это?

declare @LastName varchar(50) = 'Nixon'; 

SELECT * FROM users 
    WHERE (@LastName IS NULL) OR (@LastName = LastName); 
+0

Это не та же логика. Например, если @LastName не является нулевым, а LastName имеет значение null, ваша логика будет давать неожиданные результаты. Это связано с тем, что моя логика выше НЕ возвращает все результаты, если LastName имеет значение NULL. Не за что. –

+0

Вы имеете в виду, возможно, второй запрос, который я только что добавил? –

+0

Да, это правильная логика, но гораздо сложнее, чем мой образец. Я вижу, как это меньше. –

Смежные вопросы