2

我正在处理 SQL 中的 select 语句,并且在尝试创建包含 case 语句或 if else 语句的 where 子句时遇到问题。我想根据变量的值选择记录。如果变量为“True”,则仅从 select 语句中返回列为空的记录。如果变量不是“真”,则返回所有记录,无论该列是否为空。

关于如何做到这一点的任何提示?

下面是我正在尝试做的一个简单示例:

declare @option1 as varchar(5)

--This can be True or False so to test i just put the Set option below
set @option1 = 'True'

Select a,b,c,d...
from ...
where d = case when @option1 = 'True' then NULL End

这是我不知道该怎么做的部分。如果变量为“真”,我只需要过滤掉记录,所以不确定在案例的 else 部分中放置什么。

4

2 回答 2

9

您不能d = NULL像您的 CASE 语句那样进行测试,因为这将始终返回 false,因为NULL 不等于 NULL(除非您将 ANSI_NULLS 设置为“off”)。

最简单的做法是将 WHERE 子句更改为:

WHERE @option1 = 'False' OR d IS NULL

如果出于某种原因你更喜欢使用 CASE 语句,你可以这样写:

WHERE 1 = CASE WHEN @option1 = 'False' THEN 1 
               WHEN @option1 = 'True' AND d IS NULL THEN 1 
               ELSE 0 
          END
于 2012-12-19T00:01:02.877 回答
1

这:

更新:PinnyM 让我明白了这一点。为了大众的教育,我把我令人尴尬的逻辑错误的论点留在这里。我在下面“试试这个”之后提出的解决方案当然仍然有效,但 PinnyM 的解决方案要优雅得多,应该使用。

WHERE @option1 = 'False' OR d 为 NULL

将始终返回给定当前选择语句的所有结果(假设 @Option1 只是传入的标志参数)。

试试这个:

SELECT a, b, c, d
WHERE 
    -- Returns only rows where d is null (if @Option1 is True)
    (@Option1 = 'True' AND d IS NULL) 
    OR
     -- returns all the rows (if @Option1 is False)
    (@Option1 = 'False')
于 2012-12-19T02:01:45.650 回答