奇怪的SQL Server比较总是错误的

时间:2012-10-19 17:55:07

标签: sql-server-2008 tsql

declare @test int
declare @test2 int = 3

select case when @test != @test2 then 1 else 0 end
select case when @test = @test2 then 1 else 0 end

结果总是0.有人可以解释一下吗?

3 个答案:

答案 0 :(得分:4)

您还没有为@test设置值,因为它是NULL

@test永远不会等于或不等于@test2,因为与NULL的任何比较都将为假。

答案 1 :(得分:2)

此行为由ANSI_NULLS设置选项控制。实际上,如果您将ANSI ANSI_NULLS设置为OFF,则第一次选择将获得1。

NULL是一个特殊值,它是一个未知值。您可以这样阅读您的查询:

当未知值不等于3时,选择一个值 当未知值等于3

时,选择一个值

由于该值未知,它可能匹配也可能不匹配,因此您不能认为它不相等,因为它们可能相等。由于您比较了一个未知值,它就像您比较所有可能的值,并且由于有一个可能的值使它失效,因此该语句为false。

答案 2 :(得分:0)

如果我在没有默认值的情况下声明变量时没有弄错,则赋值为null。因此,在您的两个SELECT CASE语句中,您将null与实际值进行比较,并且比较将不起作用。