2012-01-03 174 views
3

我需要根據存儲過程中的ManufacturerID過濾表,但是當空的ManufacturerID傳入時,我需要所有訂單。CASE在SELECT WHERE語句存儲過程?

我可以在WHERE語句中這樣做,所以我不必讓整個查詢在我的SP中寫兩次?

回答

6
WHERE 
    @param IS NULL OR field = @param 

但是請注意,如果將其擴展到搜索多個列,這會非常低效。 (見http://www.sommarskog.se/dyn-search.html)的低效擴大版

例...

WHERE 
     (@param1 IS NULL OR field1 = @param1) 
    AND (@param2 IS NULL OR field2 = @param2) 
    AND (@param3 IS NULL OR field3 = @param3) 
+0

好奇,如果你可以'WHERE ManufacturerID = coalesce(@ param,ManufacturerID)' – vol7ron 2012-01-03 17:13:45

+0

@ vol7ron - 只提供'@ param'爲NULLABLE而不是字段本身,那麼是。您的版本將永遠不會返回ManufacturerID爲NULL的任何記錄。除此之外,它的行爲與我的答案相同。 – MatBailie 2012-01-03 17:17:54

+0

只是好奇,有一段時間沒有使用SQL Server-看起來馬克班尼斯跳過我的評論:)鑑於你的說法,我會告訴他做'在哪裏coalesce(table.field,'')= coalesce(@ param,table.field,'')',但你的解決方案顯然是最好的選擇 – vol7ron 2012-01-03 17:43:24

2

你可以這樣做:

where t.ManufacturerID = @ManufacturerIDParam OR @ManufacturerIDParam is null 
+0

@Downvoters您是否願意解釋您的投票,因爲這個答案與接受的答案*幾乎相同* – dasblinkenlight 2012-01-03 17:40:23

+0

+1 - 面對不公正的情況,直到解釋或刪除倒票 – MatBailie 2012-01-03 17:42:49

1

嘗試:

WHERE table.field = coalesce(@param, table.field) 
+2

不太可能,因爲OP提到了一個ID字段,但這確實有一個角落案例要注意:這將永遠不會返回記錄,其中字段IS NULL' – MatBailie 2012-01-03 17:23:41

1

這也可能導致參數嗅探問題。如果可能,可能首先要清除空值?

+0

這錯過了重點。 OP正試圖在數據上編寫一個通用的過濾器。如果指定了值,則只返回匹配的記錄。否則,如果沒有指定值,則返回所有記錄。 – MatBailie 2012-01-03 17:43:59

+0

好點。我很抱歉。 – 2012-01-03 18:06:40