我的行有1,2,3和null。为什么不会有两个返回相同的结果:
select * from foo where foobar not in (1, 2, 3);
select * from foo where foobar is not null;
第一个返回空集,而第二个返回广告。现在我有点困惑:-D在任何地方都有某种“新手SQL中的NULL”文档吗? :-D
(我正在使用Oracle,如果这很重要)
答案 0 :(得分:5)
这是因为您的第一个声明正在评估如下:
select * from foo
where foobar <> 1 and foobar <> 2 and foobar <> 3
“null&lt;&gt; 1”的计算结果为null,而不是true / false,因此不会返回任何内容。
答案 1 :(得分:4)
任何涉及NULL
的布尔操作总是失败。如果foobar
为NULL
,则:
- 测试= 1
失败
- 但<> 1
也失败了。
这意味着NULL not in (1, 2, 3)
总是失败。
这是NULL Logic
的特点,一开始就习惯了。 NULL
可以表示Unknown
。这意味着它可能是1
,可能不是。这是不确定的。
所以,当你问is NULL in the list (1, 2, 3)
答案是 我说不出来时,它是不确定的 。因此,答案本身不是TRUE
或FALSE
,而是NULL
。
由于NULL
不是TRUE
,因此该行未通过测试。
答案 2 :(得分:0)
not in
与in