为什么要将SQL日期变量与null进行比较?
我刚刚在用SQL编写的过程中遇到了一个有趣的问题 在我的程序中,我有两个日期,它们是可选的参数,默认为NULL,我想检查这些参数是否为NULL,如果不是我程序的运行部分,如果它们为NULL,则忽略程序的额外部分 我做了一个相当基本的为什么要将SQL日期变量与null进行比较?,sql,sql-server,sql-server-2008,stored-procedures,Sql,Sql Server,Sql Server 2008,Stored Procedures,我刚刚在用SQL编写的过程中遇到了一个有趣的问题 在我的程序中,我有两个日期,它们是可选的参数,默认为NULL,我想检查这些参数是否为NULL,如果不是我程序的运行部分,如果它们为NULL,则忽略程序的额外部分 我做了一个相当基本的IF(@dateVariable NULL和@DateVariable2 NULL)语句,但是IF语句永远不会工作,即使变量不为NULL,我假设SQL正在努力将日期与NULL进行比较,这很奇怪,因为datetime可以为NULL 为了解决这个问题,我刚刚做了IF(Da
IF(@dateVariable NULL和@DateVariable2 NULL)
语句,但是IF语句永远不会工作,即使变量不为NULL,我假设SQL正在努力将日期与NULL进行比较,这很奇怪,因为datetime可以为NULL
为了解决这个问题,我刚刚做了IF(DateVariable不为NULL)
,它工作正常。我还尝试了IF(ISNULL(@DateVariable,)“”)
,它也可以正常工作
所以我的问题是,为什么第一个IF不起作用,但是第二个和第三个IF都起作用,因为它们都必须在某个点上比较变量的内容是否为null
例如:
-----失败-----
DECLARE@Date-DATETIME
设置@Date=当前时间戳
如果(@Date NULL)
开始
打印('a')
结束
-----工作-----
DECLARE@Date-DATETIME
设置@Date=当前时间戳
如果(ISNULL(@Date,)“”)
开始
打印('a')
结束
声明@Date-DATETIME
设置@Date=当前时间戳
如果(@Date不为空)
开始
打印('a')
结束
简单地说,“NULL”不等于“NULL”“空”与不确定状态相当,其中一个不确定的事物不一定等于另一个也不确定的事物。测试空值时,请使用“IS NULL”、“ISNULL()”或“COALESCE()”。将ANSI_null设置为“off”可以更改此行为,但这不是ANSI SQL标准。有关更多信息,请参阅
比较空值时必须小心。政府的行为
比较取决于SET ANSI_NULLS选项的设置
启用“设置ANSI_NULLS”时,一种比较,其中一个或多个
表达式为NULL不会产生TRUE或FALSE;它产生
不知道。这是因为无法比较未知的值
逻辑上与任何其他值相反。如果表达式
与文本NULL进行比较,或者如果比较两个表达式
其中一个计算结果为NULL
请参见将
NULL
视为未知值
。@Date=未知值
应该产生什么结果<代码>真值<代码>错误?或者我们不知道
?不推荐将ANSI_NULLS设置为OFF。
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