null不在详尽的列表中

时间:2012-03-30 10:01:52

标签: sql oracle null

我的行有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,如果这很重要)

3 个答案:

答案 0 :(得分:5)

这是因为您的第一个声明正在评估如下:

select * from foo
where foobar <> 1 and foobar <> 2 and foobar <> 3

“null&lt;&gt; 1”的计算结果为null,而不是true / false,因此不会返回任何内容。

答案 1 :(得分:4)

任何涉及NULL的布尔操作总是失败。如果foobarNULL,则:
- 测试= 1失败 - 但<> 1也失败了。

这意味着NULL not in (1, 2, 3)总是失败。


这是NULL Logic的特点,一开始就习惯了。 NULL可以表示Unknown。这意味着它可能是1,可能不是。这是不确定的。

所以,当你问is NULL in the list (1, 2, 3)答案是 我说不出来时,它是不确定的 。因此,答案本身不是TRUEFALSE,而是NULL

由于NULL不是TRUE,因此该行未通过测试。

答案 2 :(得分:0)