[英]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.