Sql server 2008 带有用户输入的where语句中的用例
我试图增加所有可能的年度费用,但我的案例陈述闻起来不对劲 如果选择2013年,我希望能够将2006年到2013年的所有费用相加。没有案例陈述,有没有更好的方法?还是我走错了路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
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年的示例),这是一个很好的泛化查询。谢谢,这解决了我的问题。我甚至没有想过要在两者之间使用,我想我是想得太多了…:)