2012-12-18 128 views
2

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

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

下面是什么,我试图做一个简单的例子:

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 

这是我不知道该怎么做的部分。我只需要过滤掉记录,如果变量是'真',所以不知道该怎么把案件的其他部分。

回答

9

您不能测试d = NULL作为您的CASE语句,因为它将始终返回false,因为NULL is not equal to 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 
1

这个:

更新:PinnyM已经弄清了这一点。我在这里离开了我在群众教育方面令人尴尬的逻辑上有缺陷的论点。我在“尝试这个”之后提出的解决方案当然依然有效,但PinnyM的解决方案更加优雅,应该使用。

WHERE @选项1 = '假' OR d IS NULL

总是返回所有的结果给了他目前的select语句(假设@选项1是简单地传递一个标志参数)。

试试这个:

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') 
+0

在WHERE子句中我写的,如果@选项1是“真”和d不为空,则记录将被排除在外。我非常肯定这正是OP所要求的...... – PinnyM

+0

如果我理解OP的问题(并且它是解释性的!),则Option1不是表中的字段,因此,Option1的状态对记录的过滤。在您提出的WHERE子句中,无论Option1的值如何,都将包含d IS NOT NULL的所有行,并且其中始终包含d IS NULL的所有行。没有过滤(除非我错过了一些愚蠢的东西,这完全有可能)。 – XIVSolutions

+0

@PinnyM - 我相信你的第二个选择可以做到这一点。 – XIVSolutions