2014-10-30 130 views
0

我有3列,让我们打电话给他们column Acolumn Bcolumn C每列是一个日期。SQL - 问题与WHERE逻辑

我想写的,其中的逻辑是这样的:

如果A列是NULL,或者如果C列日期比今天的今天减去3天更大
如果B栏为空或如果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中

+0

这是一个全面的查询。它们有点具有挑战性,性能可能非常糟糕。看看这篇文章,它解释了处理这种类型查询的多种方法。 http://sqlinthewild.co.za/index。php/2009/03/19/catch-all-queries/ – 2014-10-30 16:06:52

+2

@ user979331您已经使用了“AND”条件,只有在满足所有3个条件的情况下才会获取数据,因此您提到的缺失数据不符合前2条件不会出现在输出中。使用“OR”条件并查看它是否有效。 – 2014-10-30 16:18:04

+1

发布一些符合条件但不符合条件的样本数据。 – Andrew 2014-10-30 16:23:29

回答

1

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

一)这应该是逻辑上正确的答案你的描述:

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

这听起来像你真的想用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())) 
+0

这将返回不应该在那里的项目:( – user979331 2014-10-30 16:52:05

+0

然后请发布一些示例数据。 – programmer43229 2014-10-30 16:55:43

0

如果A列是NULL,或者如果C列日期比今天的今天减去3天更大。如果B栏为空,或者如果C列日期比今天的今天减去3天更大。如果C栏为空,或者如果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为你使用否则,如果您想检索相匹配的任何一个数据数据条件使用OR而不是AND