繁体   English   中英

动态where子句基于变量

[英]Dynamic where clause based on variable

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

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

以下是我想要做的一个简单示例:

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

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

您不能像CASE语句那样测试d = NULL ,因为它总是返回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

这个:

更新:PinnyM已经把我拉了出来。 我在这里为群众的教育留下了令人尴尬的逻辑缺陷。 我在“试试这个”之后提出的解决方案当然仍然有效,但PinnyM的解决方案更优雅,应该使用。

WHERE @ option1 ='False'或者d为空

将始终返回给定当前select语句的所有结果(假设@ 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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM