为什么将SQL日期变量与null进行比较会以这种方式运行?

时间:2012-01-25 14:45:06

标签: sql sql-server sql-server-2008 stored-procedures

我刚刚遇到一个有趣的问题,我正在用SQL编写一个程序。

在我的proc中我有2个日期,这是可选参数默认为NULL,我想检查这些参数是否为空并且如果没有运行我的proc的一部分,如果它们为null则则proc的额外部分是忽略。

我做了一个相当基本的IF(@dateVariable <> NULL AND @DateVariable2 <> NULL)语句,但if语句永远不会工作,即使变量不为null,我会假设SQL正在努力将日期与NULL进行比较,这很奇怪,因为datetime可以为空。

为了解决这个问题,我刚刚做了IF(DateVariable IS NOT NULL),它正常工作。我也尝试了IF( ISNULL(@DateVariable,'') <> ''),它也能正常工作

所以我的问题是为什么第一个IF不起作用,但第二个和第三个IF都这样做,因为两者都必须在某个时候将变量的内容比较为null?

示例:

-----失败-----

DECLARE @Date DATETIME
SET @Date = CURRENT_TIMESTAMP

IF (@Date <> NULL)
BEGIN
    print('a')
END

-----作品-----

DECLARE @Date DATETIME
SET @Date = CURRENT_TIMESTAMP

IF (ISNULL(@Date,'') <> '')
BEGIN
    print('a')
END

DECLARE @Date DATETIME
SET @Date = CURRENT_TIMESTAMP

IF (@Date IS NOT NULL)
BEGIN
    print('a')
END

2 个答案:

答案 0 :(得分:13)

简单地说'NULL'不等于'NULL'。 “NULL”与不确定状态相当,其中一个不确定的东西不一定等于其他不确定的东西。在测试空值时使用'IS NULL','ISNULL()'或'COALESCE()'。将ANSI_NULLS设置为“off”可以更改此行为,但它不是ANSI SQL标准。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms191270.aspx

答案 1 :(得分:4)

  

比较空值时必须小心。的行为   比较取决于SET ANSI_NULLS选项的设置。

     

当SET ANSI_NULLS为ON时,进行比较,其中一个或多个   表达式为NULL不会产生TRUE或FALSE;它产生了   未知。这是因为无法比较未知的值   逻辑上反对任何其他价值。如果表达式中出现这种情况   与文字NULL进行比较,或者比较两个表达式   其中一个评估为NULL。

请参阅NULL Comparison Search Conditions