SQL条件丢失NULL值

时间:2014-04-24 14:41:53

标签: sql sql-server null conditional

我正在使用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;?

4 个答案:

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