2012-04-16 58 views
1

我正在對傳入幾個變量並比較幾個字段的單個表執行搜索查詢。 像這樣:我需要一個搜索來匹配存儲爲空的值

  WHERE a.callerfname LIKE @FName 
       AND a.callerlname LIKE @LName 
       AND a.callermname LIKE @MName 

的形式,如果被選擇用於字段因此該領域的所有結果相匹配的一個沒有值發送以%。

一個字段是ProjectID這是一個Guid,可能包含null值。 當我沒有項目搜索選擇的形式通過在空白的Guid(000000-000 ...),我在CASE檢查它像這樣:

AND a.projectid = CASE WHEN @ProjectId <> '00000000-0000-0000-0000-000000000000' 
         THEN @ProjectId 
         ELSE a.projectid 
          END 

麻煩的是,如果行有一個NULL ProjectID它不會匹配它自己。 我的問題是在一個GUID字段中的空值會匹配什麼?或者我怎麼能讓projectid返回所有的值,如果null的方式和名稱會比較%?

+0

請看這裏:WHERE(column = @參數OR NULLIF(@Parameter,'%')IS NULL)' – 2012-04-16 18:06:38

回答

0

在SQL中NULL不等於任何值,並且NULL不等於NULL。你必須測試「IS NULL」。或者,您可以將isnull(列,默認值)應用於測試的兩側。這些都應該工作。我不使用GUID很多,所以我堅持你的空GUID值在isNull條件,因爲你需要保持數據類型匹配,我認爲這是一個有效的GUID值。

AND ISNULL(a.projectid, '00000000-0000-0000-0000-000000000000') = CASE WHEN @ProjectId <> '00000000-0000-0000-0000-000000000000' THEN @ProjectId ELSE isnull(a.projectid, '00000000-0000-0000-0000-000000000000') END 

或者

AND (a.projectid = CASE WHEN @ProjectId <> '00000000-0000-0000-0000-000000000000' THEN @ProjectId ELSE a.projectid END) OR (a.projectid is null) 
0

這應該是你的項目的過濾器。如果參數是空的GUID,所有項目都匹配;如果不是,只有一個(或沒有)匹配。

WHERE (@ProjectId = '00000000-0000-0000-0000-000000000000' 
     OR a.projectid = @ProjectId) 
相關問題