我正在查看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的回答比“复制”中的回答更清晰/更好。
答案 0 :(得分:2)
Null未定义;它不等于,或不等于任何东西。它有its own section in the documentaion,conditions 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