2
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。有人可以解释一下吗?

4

3 回答 3

4

你还没有为它设置一个值@test,它就是NULL.

@test永远不会等于或不等于@test2,因为任何比较NULL都是错误的。

于 2012-10-19T17:56:21.803 回答
2

此行为由 ANSI_NULLS 设置选项控制。事实上,如果你 SET ANSI_NULLS OFF 你会得到一个 1 的第一个选择。

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

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

由于该值是未知的,它可能匹配也可能不匹配,因此您不能假设它不相等,因为它们可能相等。由于您比较了一个未知值,因此就像您比较所有可能的值一样,并且由于有一个可能的值使其无效,因此该语句是错误的。

于 2012-10-19T18:16:21.710 回答
0

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

于 2012-10-19T17:57:54.427 回答