SQL - WHERE逻辑问题

时间:2014-10-30 16:02:29

标签: sql sql-server sql-server-2008

我有3列,我们称之为column Acolumn Bcolumn C,每列都是日期。

我正在尝试写下这样的逻辑:

如果列A为NULL或者列C日期大于今天的当天减去3天
如果列B为NULL或者列C日期大于今天的当前减去3天
如果列C为NULL或者列C日期大于今天的当前减去3天

我想出了这个,但是当我运行它时,我缺少物品:

( columnA IS NULL OR columnA >= Dateadd(day, -3, Getdate()) ) 
AND
( columnB IS NULL OR columnB >= Dateadd(day, -3, Getdate()) ) 
AND
( columnC IS NULL OR columnC >= Dateadd(day, -3, Getdate()) )

这引起了冲突,例如,我有一个项目缺失,原因如下:

columnA日期少于今天的日期减去3天
columnB日期小于今天的日期减去3天
columnC为NULL

因此,因为columnC为NULL,所以该项应该出现。我做错了什么?

谢谢,

我正在使用SQL Server Management Studio 2008

3 个答案:

答案 0 :(得分:2)

听起来你真的想在你的条款之间使用OR而不是AND

( columnA IS NULL OR columnA >= Dateadd(day, -3, Getdate()) ) 
OR
( columnB IS NULL OR columnB >= Dateadd(day, -3, Getdate()) ) 
OR
( columnC IS NULL OR columnC >= Dateadd(day, -3, Getdate()) )

答案 1 :(得分:1)

您的问题描述和您的代码在'more'子句的关联方面有所不同,因此答案也不是明确的。请详细说明您的问题 - 也请参阅前评论的优化提示。

a)这应该是对您的描述的逻辑上正确的答案:

WHERE ( columnA IS NULL OR columnB IS NULL OR columnC IS NULL OR columnC >= Getdate()-3 )

b)从您的代码中得出,这应该是逻辑上正确的答案(但尚未优化):

WHERE (   columnA IS NULL OR columnA >= Dateadd(day, -3, Getdate())  
       OR columnB IS NULL OR columnB >= Dateadd(day, -3, Getdate())
       OR columnC IS NULL OR columnC >= Dateadd(day, -3, Getdate()) 
      )

答案 2 :(得分:0)

如果列A为NULL或者列C日期大于今天'今天减去3天如果列B为NULL或者列C日期大于今天' s今天减去3天如果列C为NULL或者如果C列日期大于今天减去3天

( columnA IS NULL 
                  OR columnC >= 
                     Dateadd(day, -3, Getdate()) ) 
           AND ( columnB IS NULL 
                  OR columnC >= 
                     Dateadd(day, -3, Getdate()) ) 
           AND ( columnC IS NULL 
                  OR columnC >= 
                     Dateadd(day, -3, Getdate()) )

如果您想要检索满足任何一个条件的数据而使用AND而不是{{ 1}}