我试图在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的新手,非常感谢人们可以提供的任何帮助。
答案 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中的任何字词匹配,%
字符有助于查找所有列。