我需要编写一个基于制造商ID的存储过程来筛选表格,但如果传入“null”制造商ID,则需要返回所有订单。
我是否可以在WHERE语句中完成这个操作,以避免在SP中重复编写整个查询?
我是否可以在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
尝试:
WHERE table.field = coalesce(@param, table.field)
field IS NULL
的记录。 - MatBailie
WHERE ManufacturerID = coalesce(@param,ManufacturerID)
? - vol7ron@param
是可空的,而不是字段本身,那么是的。您的版本永远不会返回任何制造商ID为空的记录。除此之外,它的行为与我的答案相同。 - MatBailieWHERE coalesce(table.field,'') = coalesce(@param, table.field, '')
,但您的解决方案显然是最佳选择。 - vol7ron''
不是一个合法的值。此外,要小心隐式转换;在这种情况下,该字段很可能是INT而不是字符串。 - MatBailie