【发布时间】:2012-01-04 01:41:27
【问题描述】:
我需要在存储过程中根据 ManufacturerID 过滤表,但是当传入 null ManufacturerID 时,我需要所有订单。
我可以在 WHERE 语句中执行此操作,这样我就不必在我的 SP 中将整个查询写入两次了吗?
【问题讨论】:
标签: sql sql-server
我需要在存储过程中根据 ManufacturerID 过滤表,但是当传入 null ManufacturerID 时,我需要所有订单。
我可以在 WHERE 语句中执行此操作,这样我就不必在我的 SP 中将整个查询写入两次了吗?
【问题讨论】:
标签: sql sql-server
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 ManufacturerID = coalesce(@param,ManufacturerID)
@param 为 NULLABLE 而不是字段本身,则可以。您的版本将永远不会返回 ManufacturerID 为 NULL 的任何记录。除此之外,它的行为与我的答案相同。
WHERE coalesce(table.field,'') = coalesce(@param, table.field, ''),但你的解决方案是显然是最好的选择
'' 已经不是表中的合法值。另外,请注意隐式转换;在这种情况下,该字段可能是 INT 而不是字符串。
你可以这样做:
where t.ManufacturerID = @ManufacturerIDParam OR @ManufacturerIDParam is null
【讨论】:
试试:
WHERE table.field = coalesce(@param, table.field)
【讨论】:
field IS NULL 的记录
这也可能导致参数嗅探问题。如果可能,是否希望先清理空值?
【讨论】: