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.有人可以解释一下吗?
答案 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与实际值进行比较,并且比较将不起作用。