选择Where

时间:2015-08-31 15:23:15

标签: sql-server

我试图在WHERE子句中使用case语句从表中进行选择。这是一个存储过程,它接受几个输入字符串。我有一个变量@Region,其值可以是('ALL','NE','NY','PA')。

我正在尝试这样的事情:

SELECT sum(ElectricTotalBudgetCost)
FROM dbo.Properties 
WHERE aYear=@ParamYear and aMonth=@ParamMonth AND
Properties.StateRegion=
    CASE
        WHEN  @Region ='ALL' THEN '%'
        ELSE @Region
    END

代替'%',我也尝试过IS NOT NULL。我也尝试过使用WHEN @ Region ='ALL'THEN LIKE'%'

在所有情况下都存在语法问题,或者当“ALL”传递给过程时会出现NULL结果。我的猜测是,我正在以错误的方式看待这个问题。我花了很多时间研究,似乎无法想到另一种方法来实现这一目标。我是SQL的新手,非常感谢人们可以提供的任何帮助。

3 个答案:

答案 0 :(得分:3)

也许代替:

 CASE
        WHEN  @Region ='ALL' THEN '%'
        ELSE @Region
    END

使用:

 CASE
        WHEN  @Region ='ALL' THEN Properties.StateRegion
        ELSE @Region
    END

这假设选择“ALL”时,您不想应用任何过滤。 它进一步假设@Region只包含一个('NE','NY','PA')值而不是多个;并且NE,NY和PA是Properties.StateRegion

中的值

答案 1 :(得分:3)

你真的想要这样做吗?

SELECT sum(ElectricTotalBudgetCost)
FROM dbo.Properties 
WHERE aYear=@ParamYear and aMonth=@ParamMonth AND
(Properties.StateRegion=@Region or @Region = 'ALL')

如果“ALL”是@Region

的值,这将返回所有行

答案 2 :(得分:0)

您可以将语句更改为使用Properties.StateRegion LIKE @Region,而在SELECT语句之前,您可以使用此IF语句:

IF @Region = 'ALL'
BEGIN
    SET @Region = '%'
END

使用LIKE有助于您的专栏与@Region中的任何字词匹配,%字符有助于查找所有列。