t-sql将'='改为'>或者<'在案例陈述中

时间:2011-02-24 21:33:13

标签: sql sql-server tsql

这是一个大问题的一部分。

我要做的是,如果变量@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

有可能吗?或者,我是否必须做一件很麻烦的事情,即把所有东西都变成长串,然后根据需要添加它?

我遇到语法错误,不知道如何形成这样的事情。

4 个答案:

答案 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记录。