IF语句的结果为NULL

时间:2015-02-17 17:16:28

标签: sql-server

我正在使用SQL Server 2008.我当前的脚本已将SET ANSI_NULLS设置为ON(即,如果对表达式进行比较操作为NULL,则比较将返回UNKNOWN,而不是TRUE或FALSE)。只有当IF语句返回TRUE时,IF语句才会执行T-SQL批处理吗?或者,它可以在IF语句返回UNKNOWN时执行吗?

作为一个测试案例,我试图确定以下IF语句中会发生什么:

IF CONVERT(varchar(10), @some_date, 101) = '01/01/1900'
do things

据我所知,“do things”只有在给定的IF语句返回TRUE时才会执行。因此,作为示例,如果@some_date = '01 / 01/1901',则IF语句返回FALSE,这意味着“do things”将不会执行。另一个例子,如果@some_date为NULL,CONVERT也将返回NULL(我认为),这意味着NULL将(尝试)与'01 / 01/1900'进行比较,这意味着IF语句将返回UNKNOWN(因为ANSI_NULLS是ON)。由于UNKNOWN不为TRUE,因此“do things”将不会执行。我对此的理解是否正确?

1 个答案:

答案 0 :(得分:0)

使用coalesce()函数将NULL替换为已知值。

此外,由于您的值已经是日期,因此您最好将常量1/1/1900视为日期,而不是将@some_value转换为字符串。

--assuming @some_date is actually a datetime, and you only want to compare the date portion
If coalesce(cast(@some_date as date), '1900-01-01') = '1900-01-01'
Begin
    -- do something
End

另外,您可以自己测试一下。请查看以下代码:

--set ansi_nulls off
declare @some_date datetime; 

--set @some_date = '01/01/1900'

If convert(varchar(10), @some_date, 101) = '01/01/1900'
    print 'True'

在Sql Server Management Studio中使用和不使用注释行进行尝试,并观察结果。