SQL CASE查询条件

时间:2015-07-23 01:24:41

标签: sql sql-server sql-server-2008

我的存储过程中存在以下条件:

[DMO].[DriverModelName] =
   CASE WHEN ISNULL(@driverModelName,'NotSet') = 'NotSet' THEN 
[DMO].[DriverModelName]
   ELSE
@driverModelName
    END

这意味着当我将'NotSet'传递给varchar参数@driverModelName时,它应该返回所有行但是由于某种原因它只返回那些具有值的行在专栏DriverModelName&省略null值行。

我在这里做错了吗?

2 个答案:

答案 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)

供参考:

  1. http://www.sqlservercentral.com/blogs/steve_jones/2010/10/13/common-sql-server-mistakes-1320-equals-null/
  2. SQL is null and = null
  3. Why does NULL = NULL evaluate to false in SQL server
  4. 关于Catch-All查询的补充阅读:

      Gail Shaw的
    1. Catch-all Queries
    2. The Curse and Blessings of Dynamic SQL作者:Erland Sommarskog

答案 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()处理双方