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。有人可以解释一下吗?
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。有人可以解释一下吗?
你还没有为它设置一个值@test
,它就是NULL
.
@test
永远不会等于或不等于@test2
,因为任何比较NULL
都是错误的。
此行为由 ANSI_NULLS 设置选项控制。事实上,如果你 SET ANSI_NULLS OFF 你会得到一个 1 的第一个选择。
NULL 是一个特殊值,它是一个未知值。您可以像这样阅读您的查询:
选择一个值,当未知值不等于 3 选择一个值,当未知值等于 3
由于该值是未知的,它可能匹配也可能不匹配,因此您不能假设它不相等,因为它们可能相等。由于您比较了一个未知值,因此就像您比较所有可能的值一样,并且由于有一个可能的值使其无效,因此该语句是错误的。
如果我在声明没有默认值的变量时没有弄错,则分配的值为空。因此,在您的两个 SELECT CASE 语句中,您将 null 与实际值进行比较,并且比较将不起作用。