使用存储过程中的位输入来确定如何在where子句中过滤结果

时间:2011-11-30 20:52:32

标签: sql-server sql-server-2005 tsql

我在这里靠近墙壁......我想不出办法把它拉下来。

这是我的设置:

我的表格中有一个列完成日期。如果它从未完成,则该字段为空。很简单。

在前端,我有一个默认为“仅显示不完整的条目”的复选框。当只提取不完整的条目时,这很容易。

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

知道如何完成这项看似简单的任务吗?我很难过......谢谢。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

嗯......我想你想要的是这个:

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

因此,如果OnlyIncomplete = 0,则显示Date = NULL plus,Date!= Null。是的,我认为就是这样。

答案 2 :(得分:0)

如果您仍想使用CASE功能(虽然在这种情况下可能有点过分):

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