sql—使用select在查询中读取数字变量中的null值,但oracle不将其视为null变量..中的值是多少?

dsekswqp  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(343)

在oracle过程中执行以下块

  1. val NUMBER := 0;
  2. BEGIN
  3. SELECT VALIDITY / 24
  4. INTO val
  5. FROM validity_table
  6. WHERE id = 123;
  7. DBMS_OUTPUT.PUT_LINE('Validity : '||val);
  8. IF(val = NULL)
  9. THEN
  10. val := 0;
  11. DBMS_OUTPUT.PUT_LINE('Validity : '||val);
  12. END IF;
  13. EXCEPTION
  14. WHEN NO_DATA_FOUND
  15. THEN
  16. NULL;
  17. END;

输出:

  1. Validity :

在validity\表中,id 123的validity值为null,但在执行它时,控制不进入if块。输出只打印一次,没有值。想知道“val”变量包含什么值。

8ljdwjyq

8ljdwjyq1#

问题不在于oracle(以及所有其他rdbms和sql标准)对空值的考虑,而是您对它们的误解。空值实际上引入了三值逻辑:任何同情的结果都可能是真、假或空。如果在这种特殊情况下,比较结果(val=null)为null;因为null不是真的,所以if条件不满足,因此不处理。请参阅此小提琴以获取涉及null的比较。
可惜oracle还没有看到sql中布尔值的好处。我猜他们会想,如果1979年不需要它,为什么2019年就需要它(毕竟仅仅40年就能改变多少)?

相关问题