2014-10-30 93 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