2012-01-03 140 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