存储过程中SELECT WHERE语句中的CASE用法?

3
我需要编写一个基于制造商ID的存储过程来筛选表格,但如果传入“null”制造商ID,则需要返回所有订单。
我是否可以在WHERE语句中完成这个操作,以避免在SP中重复编写整个查询?
4个回答

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)

请问您是否可以使用WHERE ManufacturerID = coalesce(@param,ManufacturerID) - vol7ron
@vol7ron - 只要 @param 是可空的,而不是字段本身,那么是的。您的版本永远不会返回任何制造商ID为空的记录。除此之外,它的行为与我的答案相同。 - MatBailie
只是好奇,有一段时间没有使用SQL Server了 - 看起来Mark Bannister回复了我的评论 :) 根据您的陈述,我会告诉他执行WHERE coalesce(table.field,'') = coalesce(@param, table.field, ''),但您的解决方案显然是最佳选择。 - vol7ron
@vol7ron - 这假设表中''不是一个合法的值。此外,要小心隐式转换;在这种情况下,该字段很可能是INT而不是字符串。 - MatBailie

2
你可以这样做:
where t.ManufacturerID = @ManufacturerIDParam OR @ManufacturerIDParam is null

@Downvoters,麻烦您解释一下您的投票原因吗?考虑到这个回答与被接受的回答几乎相同 - Sergey Kalinichenko
+1 - 在不公正的情况下,直到down-vote得到解释或被移除。 - MatBailie

1
这也可能导致参数探测问题。如果可能的话,最好先清理 null 值,对吧?

那样做没有抓住重点。OP试图在数据上编写通用过滤器。如果指定了一个值,只返回匹配的记录。否则,如果没有指定值,则返回所有记录。 - MatBailie

1

尝试:

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

2
虽然 OP 提到了一个 ID 字段,但这确实有一个需要注意的边角情况:这将永远不会返回 field IS NULL 的记录。 - MatBailie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接