Sql server 2008 带有用户输入的where语句中的用例

Sql server 2008 带有用户输入的where语句中的用例,sql-server-2008,Sql Server 2008,我试图增加所有可能的年度费用,但我的案例陈述闻起来不对劲 如果选择2013年,我希望能够将2006年到2013年的所有费用相加。没有案例陈述,有没有更好的方法?还是我走错了路 SELECT ID, Sum(Amount) As Total FROM ABCD WHERE Expenses = 'Actual' AND AcountType = 'Expense' AND CASE WHEN 'Myselectionparameter' = 2013

我试图增加所有可能的年度费用,但我的案例陈述闻起来不对劲

如果选择2013年,我希望能够将2006年到2013年的所有费用相加。没有案例陈述,有没有更好的方法?还是我走错了路

 SELECT ID, Sum(Amount) As Total
FROM ABCD
WHERE Expenses = 'Actual' AND  
      AcountType = 'Expense' AND 
      CASE WHEN 'Myselectionparameter' = 2013 
           THEN ( YearID =2013 or YearID = 2012 or YearID = 2011 or YearID = 2010 or YearID = 2009 or YearID = 2008  Or YearID = 2007 or YearID = 2006 )
      END 
GROUP BY ID

那么
Myselectionparameter
int
参数吗

SELECT ID, Sum(Amount) As Total
FROM   abcd 
WHERE  ... 
       AND ( @Myselectionparameter IS NULL 
              OR YearID BETWEEN 2006 AND @Myselectionparameter ) 
GROUP  BY id 

假设您的问题是关于一个参数的,在这种情况下,您在参数名之前使用@

那么你有一个特别的答案

SELECT ID, Sum(Amount) As Total
FROM ABCD
WHERE Expenses = 'Actual' AND  
      AcountType = 'Expense' AND 
      (@Myselectionparameter = 2013 AND YearID  BETWEEN 2006 AND 2013)
      END 
GROUP BY ID
如果param说2011年呢?你想从2006年一直到2011年吗?在这种情况下,您可以得到一般答案:

SELECT ID, Sum(Amount) As Total
FROM ABCD
WHERE Expenses = 'Actual' AND  
      AcountType = 'Expense' AND 
      YearID  BETWEEN 2006 AND @Myselectionparameter
GROUP BY ID

大小写
无法返回
布尔值
结果。当Thing1=1,Thing2=2,然后1 end=1时,您需要类似于
case的东西,其中
case
会产生一个要测试的值。如果输入不正确,我可以使用代码应该做什么?目前,您的
CASE
语句(忽略布尔值问题)没有
ELSE
,因此将计算为
NULL
,并消除所有结果。知道其他输入应该发生什么是判断
案例是否合适的关键。我的dbms不喜欢常规的“if-then-else”,因此我试图找到一个替代的if-then-else是一个流控制结构(在两个动作之间选择),因此仅在过程语言中才有意义;SQL不是过程性的,它一次在整个集合上进行逻辑操作,因此如果是,那么else就没有意义了。可能需要一段时间才能习惯“关系”的思维方式,而不是尝试将if-then-else之类的东西直接转换到您的查询中。假设这是其他输入所需的行为(仅解释了2013年的示例),这是一个很好的泛化查询。谢谢,这解决了我的问题。我甚至没有想过要在两者之间使用,我想我是想得太多了…:)