2011-08-19 104 views
1

如您所知null在SQL中不會等於null。空值替代值

讓我們假設我們有這樣的查詢:

declare @LastName varchar(50) = 'Nixon'; 
select * from Users 
    where LastName = @LastName; 

如果我想允許變量爲空,我這樣做:

declare @LastName varchar(50) = 'Nixon'; 
select * from Users 
    where LastName = IsNull(@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); 

這工作得很好,我看到很多類似的方法。

但我的問題是:這真的是最好的方法?在我看來,這是一個混亂,但我已經想了很多,根本無法提出更好的東西。

編輯但這似乎最好:

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不爲null,並且LastName爲null,那麼你的邏輯會產生意想不到的結果。這是因爲如果姓氏爲空,我上面的邏輯不會返回所有結果。一點也不。 –

+0

你的意思可能是我剛剛添加的第二個查詢? –

+0

是的,這是正確的邏輯,但比我的示例複雜得多。我明白你的信譽是如何不那麼糟糕。 –