这是一个大问题的一部分。
我要做的是,如果变量@exemptionStartDate = '1900-01-01'
,那么只需选择所有内容,
即。 ce.ExemptionStartDate = ce.ExemptionStartDate
。
否则,我只想要ce.ExemptionStartDate > @exemptionStartDate
ce.ExemptionStartDate是DateTime值
SELECT foobar
WHERE foo = bar
AND ce.ExemptionStartDate = CASE WHEN @exemptionStartDate = '1900-01-01' THEN ce.ExemptionStartDate ELSE (> @exemptionStartDate) END
有可能吗?或者,我是否必须做一件很麻烦的事情,即把所有东西都变成长串,然后根据需要添加它?
我遇到语法错误,不知道如何形成这样的事情。
答案 0 :(得分:3)
不需要使问题复杂化
if @exemptionStartDate = '1900-01-01'
set @exemptionStartDate = '1753-01-01' --lowest date for datetime
然后只是
where ce.ExemptionStartDate > @exemptionStartDate
答案 1 :(得分:2)
您需要在案例中包含该列:
更新此查询将有效:
AND (@exemptionStartDate = '1900-01-01'
OR ce.ExemptionStartDate > @exemptionStartDate)
请参阅cyberwiki关于如何使用CASE
答案 2 :(得分:2)
假设表中的所有ExemptionStartDate值都大于1900-01-01,是否可以保存?
如果是这样,您可以简化为:
...
WHERE foo = bar
AND ce.ExemptionStartDate > @exemptionStartDate
答案 3 :(得分:1)
您的查询应该是
SELECT foobar
WHERE foo = bar
AND (@exemptionStartDate = 0 OR ce.ExemptionStartDate > @exemptionStartDate)
如果你确实想要一个CASE语句,这是一个逻辑技巧
SELECT foobar
WHERE foo = bar
AND ce.ExemptionStartDate >
CASE
WHEN @exemptionStartDate = 0 THEN ce.ExemptionStartDate-1
ELSE ce.ExemptionStartDate
END
它看起来很整洁,但它不会对索引有任何好处。坚持到最顶层。第一个和第二个之间的区别在于第二个不会显示任何null
ce.ExemptionStartDate记录。