【问题标题】:why exactly does "WHERE <> NULL" return 0 results为什么“WHERE <> NULL”究竟返回0个结果
【发布时间】:2015-04-21 16:38:03
【问题描述】:

我在这里查看了 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 不是一个值,你必须使用“where不为空”...

oracle 是否只有一个失败机制,只要您在 之后没有值,它就不会产生错误,只是不会返回任何结果?

编辑:alex poole 的答案比“重复”中的答案更清晰/更好

【问题讨论】:

  • 我原以为它会忽略 where 子句,因为值与非值不同......我会对答案感兴趣。
  • 我认为这就是答案:stackoverflow.com/a/9581790/3401018
  • 那是另一回事,它正在执行“where null”,这应该导致它永远不会出现这种情况,因为它永远不会不等于 null,它不会只是返回所有内容跨度>
  • @JoshE 条件无效,因此不返回任何内容。你必须按顺序思考。 “xxx null 是真的吗?”没有。

标签: sql oracle oracle11g null


【解决方案1】:

Null 未定义;它不等于或等于任何东西。它有its own section in the documentaionconditions table 表明询问是任何不等于 null(使用 != 或 比较)是“未知”。

但这不是错误,只是查询中的错误;这与在 之后没有表达式不同。你确实有一个表达式,它只是 null,并且不能与任何其他值进行比较。

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

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

【讨论】:

  • hmmm 所以因为它被视为“未知”结果,oracle 说“该死,不知道在这里做什么,无法比较这两个值,所以我不会返回任何东西"
  • 不是更像我想比较 A 和 B 但我不知道 B 是什么,所以我不知道 A B 可能是什么所以我会拒绝子句?
  • @JoshE - 不,实际上 Oracle(或任何其他关系数据库)准确地知道在这种情况下该怎么做。规则很简单——“任何与 NULL 的比较都返回 NULL”。
【解决方案2】:

如果查看常量 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 将产生 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

【讨论】:

    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2021-04-15
    相关资源
    最近更新 更多