SQL案例查询条件
我的存储过程中存在以下条件:SQL案例查询条件,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我的存储过程中存在以下条件: [DMO].[DriverModelName] = CASE WHEN ISNULL(@driverModelName,'NotSet') = 'NotSet' THEN [DMO].[DriverModelName] ELSE @driverModelName END 这意味着,当我将'NotSet'传递给varchar参数@driverModelName时,它应该返回所有行,但出于某种原因,它只返回那些列driverModelName中有
[DMO].[DriverModelName] =
CASE WHEN ISNULL(@driverModelName,'NotSet') = 'NotSet' THEN
[DMO].[DriverModelName]
ELSE
@driverModelName
END
这意味着,当我将'NotSet'
传递给varchar
参数@driverModelName
时,它应该返回所有行,但出于某种原因,它只返回那些列driverModelName
中有值的行&忽略null
值行
我在这里做错了什么吗?这是因为
NULL==NULL=FALSE
,在WHERE
子句中,除非您将ANSI_NULLS
设置为关闭。例如:
SET ANSI_NULLS OFF
IF NULL = NULL
PRINT 'TRUE'
ELSE
PRINT 'FALSE'
SET ANSI_NULLS ON
IF NULL = NULL
PRINT 'TRUE'
ELSE
PRINT 'FALSE'
结果是:
TRUE
FALSE
为了获取所有行,包括NULL
值,应该使用
(@driverModelName IS NULL OR [DMO].[DriverModelName] = @driverModelName)
供参考:
关于捕获所有查询的附加阅读:
盖尔·肖
埃尔兰·索马斯科格
如果[DMO].[DriverModelName]
曾经是NULL
那么您希望这个案例的结果是什么?该列周围是否也缺少一个ISNULL()
ISNULL([DMO].[DriverModelName], 'NotSet') =
CASE WHEN ISNULL(@driverModelName,'NotSet') = 'NotSet' THEN
[DMO].[DriverModelName]
ELSE
@driverModelName
END
你不能说NULL=@someValue,它必须是IS NULL
或者用ISNULL()处理两边的问题谢谢@T McKeown&wewesthemenace。我尝试了您的两个建议,但是该过程仍然没有返回[DMO].[DriverModelName]为空的行。如果参数@driverModelName为null,则我希望包括所有行[DMO]。[driverModelName]有值或为null或空。为什么不将整个行粘贴到其中clause@FelixPamittan&McKeown,非常感谢我从你的帖子中得到了我的解决方案。