SQL Where子句中的切换/案例具有不同的数字范围

时间:2013-08-14 21:00:06

标签: sql sql-server sql-server-2008-r2 case where

我想用SWITCH

写一个复杂的SQL (SQL Server 2008 R2)语句

目标是在WHERE语句中写出类似的内容:

  • 如果myParam = 0,则myColumn = myColumn(0表示“未定义”,因此我们“忽略”WHERE声明)
  • 如果0 < myParam < 6,则myColumn = myParam
  • 如果myParam >= 6,则myColumn = [6 ; Infinity]

所以我写道:

WHERE 
  h.MyColumn = CASE @MyParam
                 WHEN 0 THEN h.MyColumn
                 WHEN @MyParam > 0 AND @MyParam < 6 THEN @MyParam
                 WHEN @MyParam > 6 THEN /* ??? */

首先,我是好人吗? 如果是这样,我怎么能写第三个WHEN@MyParam只能等于0,1,2,3,4,5或6,在最后一种情况下,我需要在h.MyColumn > 6时选择数据。

任何有帮助的帮助! 谢谢

3 个答案:

答案 0 :(得分:2)

我认为你可以表达这么简单:

WHERE @MyParam = 0 
OR (@MyParam BETWEEN 1 AND 5 AND h.MyColumn = @MyParam)
OR (@MyParam = 6 AND h.MyColumn > 6)

答案 1 :(得分:0)

如果您只有一个参数,那么获得所需结果的一种简单方法就是使用简单的IF ... ELSE ...语句:

IF @myParam=0
BEGIN
    SELECT ...
    FROM ...
    WHERE myColumn=myColumn2 -- ?
-- or
    SELECT ...
    FROM ...
END
ELSE IF 0 < @myParam AND @myParam < 6
BEGIN
    SELECT ...
    FROM ...
    WHERE myColumn=@myParam
END
ELSE IF @myParam > 6
BEGIN
    SELECT ...
    FROM ...
    WHERE myColumn=6
END

问题:

1)如果@myParam是&lt; 0或= 6?

2)如果@myParam为空,会发生什么?

注意:您应该阅读Dynamic Search Conditions in T-SQL by Erland Sommarskog

答案 2 :(得分:0)

我的建议:

if (@myParam = 0)
Begin
    select * from table
    Where h.MyColumn = 0
End
Else if (@myParam between 1 and 5)
Begin
    select * from table
    Where (h.MyColumn between 1 and 5)
End
Else
Begin
    select * from table
    Where (h.MyColumn > 5)
End