在oracle过程中执行以下块
val NUMBER := 0;
BEGIN
SELECT VALIDITY / 24
INTO val
FROM validity_table
WHERE id = 123;
DBMS_OUTPUT.PUT_LINE('Validity : '||val);
IF(val = NULL)
THEN
val := 0;
DBMS_OUTPUT.PUT_LINE('Validity : '||val);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
END;
输出:
Validity :
在validity\表中,id 123的validity值为null,但在执行它时,控制不进入if块。输出只打印一次,没有值。想知道“val”变量包含什么值。
1条答案
按热度按时间8ljdwjyq1#
问题不在于oracle(以及所有其他rdbms和sql标准)对空值的考虑,而是您对它们的误解。空值实际上引入了三值逻辑:任何同情的结果都可能是真、假或空。如果在这种特殊情况下,比较结果(val=null)为null;因为null不是真的,所以if条件不满足,因此不处理。请参阅此小提琴以获取涉及null的比较。
可惜oracle还没有看到sql中布尔值的好处。我猜他们会想,如果1979年不需要它,为什么2019年就需要它(毕竟仅仅40年就能改变多少)?