2011-11-30 37 views
3

我在這裏擊敗我的頭......無法找到一種方法來解決這個問題。在存儲過程中使用一位輸入來確定如何篩選where子句中的結果

這裏是我的設置:

我的表有日期的東西已經完成的一列。如果從未完成,則該字段爲空。夠簡單。

在前端,我有一個複選框,默認爲「僅顯示不完整的條目」。只提取不完整的條目時,很容易。

SELECT 
    * 
FROM Sometable 
WHERE Completed_Date IS NULL 

但提供複選框選項使事情變得非常複雜。我的複選框輸入一個位值:1 =只顯示不完整,0 =全部顯示。

問題是,我不能在where子句中使用CASE語句,因爲實際值使用「=」進行比較,並且檢查null使用「IS」。例如:

SELECT 
    * 
FROM Sometable 
WHERE Completed_Date IS <---- invalid syntax 
    CASE WHEN 
     ... 
    END 


SELECT 
    * 
FROM Sometable 
WHERE Completed_Date = 
    CASE WHEN @OnlyIncomplete = 1 THEN 
     NULL  <----- this translates to "WHERE Completed_Date = NULL", which won't work.. I have to use "IS NULL" 
     ... 
    END 

任何想法如何完成這個看起來很容易的任務?我很難過...謝謝。

回答

6
... 
WHERE @OnlyIncomplete = 0 
    OR (@OnlyIncomplete = 1 AND Completed_Date IS NULL) 
+0

簡單而優雅的解決方案。比我預期的要容易得多。非常感謝。 – user1003916

0

嗯...我想你想要的是這樣的:

SELECT 
    * 
FROM Sometable 
WHERE Completed_Date IS NULL OR (@OnlyIncomplete = 0) 

這樣會顯示日期= NULL加,如果OnlyIncomplete = 0,日期!= NULL。是的,我認爲就是這樣。

0

如果你仍然想使用一個CASE函數(儘管它可能在這種情況下是矯枉過正):

SELECT 
    * 
FROM Sometable 
WHERE 1 = 
    (CASE WHEN @OnlyIncomplete = 0 THEN 1 
      WHEN @OnlyIncomplete = 1 AND Completed_Date IS NULL THEN 1 
    END) 
相關問題