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

use*_*916 3 t-sql sql-server sql-server-2005

我在这里靠着墙撞着我的脑袋......无法想出办法把它拉下来.

这是我的设置:

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

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

SELECT
    *
FROM Sometable
WHERE Completed_Date IS NULL
Run Code Online (Sandbox Code Playgroud)

但是提供复选框选项会使事情变得复杂.我的复选框输入一个位值: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
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*lli 6

...
WHERE @OnlyIncomplete = 0
    OR (@OnlyIncomplete = 1 AND Completed_Date IS NULL)
Run Code Online (Sandbox Code Playgroud)