我正在使用SQL Server 2005.我有一个变量@var,它可以取值0,1或NULL。我关心它是1还是不,0和NULL对我来说都是一样的。但是当我将它设置为1时,我将丢失NULL值:
DECLARE @var INT
SET @var = NULL
IF @var <> 1
PRINT 'not 1'
ELSE
PRINT 'equals 1'
输出为&#34;等于1&#34;。什么是正确的代码得到&#34;而不是1&#34;?
答案 0 :(得分:2)
IF @var = 1
PRINT 'equals 1'
ELSE
PRINT 'not 1'
或
IF @var <> 1 or @var is null
PRINT 'not 1'
ELSE
PRINT 'equals 1'
因为与null
比较会导致未知 true 。使用IS
运算符获取null
值。
答案 1 :(得分:2)
你也可以使用coalesce
:
if coalesce(@var, 0) <> 1
PRINT 'not 1'
ELSE
PRINT 'equals 1'
答案 2 :(得分:0)
您无法与NULL进行比较,这是使用指令
设置的属性SET ANSI-NULLS OFF
有关详情,请参阅here:
当SET ANSI_NULLS为OFF时,等于(=)和不等于(&lt;&gt;) 比较运算符不符合ISO标准。一个选择 使用WHERE column_name = NULL的语句返回的行 在column_name中具有空值。使用WHERE的SELECT语句 column_name&lt;&gt; NULL返回具有非空值的行 柱。此外,使用WHERE column_name&lt;&gt;的SELECT语句 XYZ_value返回非XYZ_value且不是XYZ_value的所有行 NULL。
但是,这个标志已被弃用,你不应该真正使用它。
这里的正确方法是
IF @var IS NULL OR @var <> 1
PRINT 'not 1'
ELSE
PRINT 'equals 1'
答案 3 :(得分:0)
NULL意味着未知,因此SQL Server不能100%确定地说它不是1.另一方面,如果你有“IF @val = 1”那么就会说它无法确定它是1并转到您的ELSE声明。
COALESCE和ISNULL解决方案可以通过将NULL值转换为已知值来为您工作,但重要的是要知道它为何如此工作。
http://technet.microsoft.com/en-us/library/ms191504(v=SQL.105).aspx