IF purpose = null THEN
v_purpose := '';
ELSE
v_purpose := ' for ' || purpose;
END IF;
当目的为空时,它仍然会转到其他地方......为什么?!
答案 0 :(得分:5)
正确的测试是
IF purpose IS NULL THEN
这是因为NULL
不是存储在字段中的值。它是属性,关于存储在别处(但在行内)的字段。
将字段设置为NULL
似乎是一个普通的分配,因此通过直接比较来预期测试是完全正交的。但是,为了使它能够正常工作,我推测SQL赋值原语有一个神奇的隐藏方面,它将特殊符号NULL
的赋值转移到设置属性而不是字段。
答案 1 :(得分:5)
NULL是SQL中的一个特殊值,无法使用相等运算符进行比较。在测试值是否为NULL时,您需要使用特殊运算符IS
和IS NOT
。
这是一个good overview of the idea。摘录:
注意:Null在Oracle中缺少信息。 null可以 已分配,但不能与任何东西等同,包括它自己。 NULL值表示丢失或未知数据。 NULL值不是 整数,字符或任何其他特定数据类型。注意NULL 与空数据字符串或数值“0”不同。
答案 2 :(得分:1)
无论purpose = null
是什么,表达式purpose
的结果都是未知的(有关详细信息,请参阅@Paul Sasik的答案)。由于它未知,因此不一定正确,因此执行会绕过IF
块的内部并进入ELSE
块。