为什么“WHERE<> NULL”确实返回0结果

时间:2015-04-21 16:38:03

标签: sql oracle oracle11g null

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

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

我只是好奇为什么“where<> NULL”导致它返回0结果...我原来的想法是它会产生错误,因为null不是一个值而你必须使用“哪里不是空的”......

oracle是否只有一个故障通过机制,只要你在<>之后没有值它不会产生错误,它不会返回任何结果吗?

编辑:alex poole的回答比“复制”中的回答更清晰/更好。

2 个答案:

答案 0 :(得分:2)

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

这不是一个错误,只是查询中的一个错误;并且它与<>之后没有表达式相同。你有一个表达式,它只是null,并且不能与任何其他值相比。

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

(可以说你也不能说任何行匹配,但拒绝一切而不是包括那个案例中的所有内容 - 对我来说更有意义 - 不管怎样我!喜欢@Sebas如何表达它。)

答案 1 :(得分:0)

如果查看常量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使用规则:几乎每个带null的操作(特殊设计除外)都会导致null结果。 a = null将产生null。 a&lt;&gt; null将产生null。 a in(1,2,3,null,5)将产生null。等等。有时它可以用于简化代码。仅举例:

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