为什么 "WHERE <> NULL" return 0 结果

why exactly does "WHERE <> NULL" return 0 results

我正在查看 oracle sql 示例问题中的一些示例:

http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=303&p_certName=SQ1Z0_051

我很好奇为什么 "where <> NULL" 会导致 return 0 个结果...我最初的想法是它会产生一个错误,因为 null 不是一个值,你会必须使用 "where is not null"...

oracle 是否只有一种失败机制,只要您在 <> 之后没有值,它就不会生成错误,它只是不会 return 任何结果?

编辑:在我看来,alex poole 的回答比 "duplicate"

中的回答 clearer/better 多

null 未定义;它不等于或 等于任何东西。它有 its own section in the documentaion, and the conditions table 表明询问是什么不等于 null(使用 != 或 <> 比较)是 'unknown'。

这不是错误,只是查询中的错误;这与 <> 后没有表达式不同。您确实有一个表达式,它只是空值,无法与任何其他值相比较。

因此,当您使用 where something <> null 时,结果是未知的,过滤器会拒绝所有行。 = null 也会发生同样的情况,即使所有值都不为空。在这两种情况下,比较的结果都是 'unknown',因此为这两种情况包含任何行都是不合理的。您不能说任何行都符合条件。

(可以说你也不能说任何行 匹配,但在这种情况下拒绝一切比包括一切更有意义 - 无论如何对我来说!虽然我喜欢@Sebas 的措辞。)

如果查看常量 NULL,您的想法是有道理的,但如果考虑可以为 NULL 的变量或字段或绑定变量,则情况会更糟。举个例子:

select * from table where field > 5

如果字段包含空值,将引发异常。

select * from table1 t1
start with parent_id is null
connect by parent_id = prior id
如果 parent_id 为 null,

将引发异常(是的...查看 connect by 子句)...等等。

Oracle 使用规则:几乎所有带空的操作(特别设计的除外)也将导致空结果。 a = null 会产生 null。 <> null 会产生 null。 a in (1,2,3,null,5) 会产生空值。等等。有时它可以用于简化代码。举个例子:

SQL> create table t$t(a integer, b integer, check(a < b));

Table created

SQL> insert into t$t values (1, 2);

1 row inserted

SQL> insert into t$t values (1, 0);

ORA-02290: check constraint (AP.SYS_C00700649) violated

SQL> insert into t$t values (1, null);

1 row inserted

SQL> insert into t$t values (null, null);

1 row inserted