我的存储过程中存在以下条件:
[DMO].[DriverModelName] =
CASE WHEN ISNULL(@driverModelName,'NotSet') = 'NotSet' THEN
[DMO].[DriverModelName]
ELSE
@driverModelName
END
这意味着当我将'NotSet'
传递给varchar
参数@driverModelName
时,它应该返回所有行但是由于某种原因它只返回那些具有值的行在专栏DriverModelName
&省略null
值行。
我在这里做错了吗?
答案 0 :(得分:2)
这是因为NULL == NULL = FALSE
,用于WHERE
子句,除非您将ANSI_NULLS
设置为OFF
。示例:
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)
供参考:
关于Catch-All查询的补充阅读:
答案 1 :(得分:0)
如果[DMO].[DriverModelName]
永远是NULL
,那么您期望这个CASE
的结果是什么?这个专栏周围是不是也错过了ISNULL()
?
ISNULL([DMO].[DriverModelName], 'NotSet') =
CASE WHEN ISNULL(@driverModelName,'NotSet') = 'NotSet' THEN
[DMO].[DriverModelName]
ELSE
@driverModelName
END
你不能说NULL = @someValue,它必须是IS NULL
或用ISNULL()
处理双方