我需要根據存儲過程中的ManufacturerID過濾表,但是當空的ManufacturerID傳入時,我需要所有訂單。CASE在SELECT WHERE語句存儲過程?
我可以在WHERE語句中這樣做,所以我不必讓整個查詢在我的SP中寫兩次?
我需要根據存儲過程中的ManufacturerID過濾表,但是當空的ManufacturerID傳入時,我需要所有訂單。CASE在SELECT WHERE語句存儲過程?
我可以在WHERE語句中這樣做,所以我不必讓整個查詢在我的SP中寫兩次?
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)
你可以這樣做:
where t.ManufacturerID = @ManufacturerIDParam OR @ManufacturerIDParam is null
@Downvoters您是否願意解釋您的投票,因爲這個答案與接受的答案*幾乎相同* – dasblinkenlight 2012-01-03 17:40:23
+1 - 面對不公正的情況,直到解釋或刪除倒票 – MatBailie 2012-01-03 17:42:49
嘗試:
WHERE table.field = coalesce(@param, table.field)
不太可能,因爲OP提到了一個ID字段,但這確實有一個角落案例要注意:這將永遠不會返回記錄,其中字段IS NULL' – MatBailie 2012-01-03 17:23:41
這也可能導致參數嗅探問題。如果可能,可能首先要清除空值?
這錯過了重點。 OP正試圖在數據上編寫一個通用的過濾器。如果指定了值,則只返回匹配的記錄。否則,如果沒有指定值,則返回所有記錄。 – MatBailie 2012-01-03 17:43:59
好點。我很抱歉。 – 2012-01-03 18:06:40
好奇,如果你可以'WHERE ManufacturerID = coalesce(@ param,ManufacturerID)' – vol7ron 2012-01-03 17:13:45
@ vol7ron - 只提供'@ param'爲NULLABLE而不是字段本身,那麼是。您的版本將永遠不會返回ManufacturerID爲NULL的任何記錄。除此之外,它的行爲與我的答案相同。 – MatBailie 2012-01-03 17:17:54
只是好奇,有一段時間沒有使用SQL Server-看起來馬克班尼斯跳過我的評論:)鑑於你的說法,我會告訴他做'在哪裏coalesce(table.field,'')= coalesce(@ param,table.field,'')',但你的解決方案顯然是最好的選擇 – vol7ron 2012-01-03 17:43:24