2012-11-10 36 views
2

我在WHERE子句中有CASE語句的問題。在我的查詢中,我想獲取日期前的行。日期檢查3列。 date1是不是NULL,所以我不需要有空檢查,但日期date2date3可以是NULL,所以我想檢查空值,並相應地檢查日期條件。我嘗試了兩種方法,但無法弄清楚如何正確執行。你能幫我嗎?與CASE和NULL檢查的地方

查詢1:

SELECT * 
FROM 
    docs 
WHERE 
    date1 < '20120601' 
    AND CASE 
     WHEN date2 IS NOT NULL AND date3 IS NOT NULL THEN date2 < '20120601' 
     WHEN date2 IS NOT NULL AND date3 IS NULL THEN date2 < '20120601' 
     WHEN date2 IS NULL AND date3 IS NOT NULL THEN date3 < '20120601' 
    END 

這給錯誤時,第一個:Incorrect syntax near '<'.

我修改我的查詢到這一點:

SELECT * 
FROM 
    docs 
WHERE 
    date1 < '20120601' 
    AND CASE 
     WHEN date2 IS NOT NULL AND date3 IS NOT NULL AND date2 < '20120601' THEN TRUE 
     WHEN date2 IS NOT NULL AND date3 IS NULL AND date2 < '20120601' THEN TRUE 
     WHEN date2 IS NULL AND date3 IS NOT NULL AND date3 < '20120601' THEN TRUE 
    END 

,並得到了另一個錯誤:An expression of non-boolean type specified in a context where a condition is expected, near 'END'.

回答

5

這應該工作:

SELECT * 
FROM 
    docs 
WHERE (date1 < '20120601') 
OR (date2 IS NOT NULL AND date2 < '201205601') 
OR (date2 IS NULL AND date3 IS NOT NULL AND date3 < '20120601') 
+0

感謝完蛋了。也許不是我想要的100%,但是由於這個,我在我的商業邏輯中發現了一個錯誤。現在everthik工作。謝謝。 –

0

這個怎麼樣?

SELECT * 
FROM 
    docs 
WHERE date1 < '20120601' 
    AND ISNULL(date2, '20120601') < '20120601' 
    AND ISNULL(date3, '20120601') < '20120601' 
1
where 
date1 < '20120601' 
    and 
coalesce(date2, date3, '20000101') < '20120601' 
0

正確的答案是:

SELECT * 
FROM 
    docs 
WHERE 
    date1 < '20120601' AND 
     ((date2 IS NOT NULL AND date3 IS NOT NULL AND date2 < '20120601') OR 
     (date2 IS NOT NULL AND date3 IS NULL AND date2 < '20120601') OR 
     (date2 IS NULL AND date3 IS NOT NULL AND date3 < '20120601'))