在PL / SQL中检查空值的正确方法是什么?

时间:2012-04-19 18:05:03

标签: sql oracle plsql

IF purpose = null THEN
   v_purpose := '';
ELSE
   v_purpose := ' for ' || purpose;
END IF;

当目的为空时,它仍然会转到其他地方......为什么?!

3 个答案:

答案 0 :(得分:5)

正确的测试是

IF purpose IS NULL THEN

这是因为NULL不是存储在字段中的。它是属性,关于存储在别处(但在行内)的字段。

将字段设置为NULL似乎是一个普通的分配,因此通过直接比较来预期测试是完全正交的。但是,为了使它能够正常工作,我推测SQL赋值原语有一个神奇的隐藏方面,它将特殊符号NULL的赋值转移到设置属性而不是字段。

答案 1 :(得分:5)

NULL是SQL中的一个特殊值,无法使用相等运算符进行比较。在测试值是否为NULL时,您需要使用特殊运算符ISIS NOT

这是一个good overview of the idea。摘录:

  

注意:Null在Oracle中缺少信息。 null可以   已分配,但不能与任何东西等同,包括它自己。   NULL值表示丢失或未知数据。 NULL值不是   整数,字符或任何其他特定数据类型。注意NULL   与空数据字符串或数值“0”不同。

答案 2 :(得分:1)

无论purpose = null是什么,表达式purpose的结果都是未知的(有关详细信息,请参阅@Paul Sasik的答案)。由于它未知,因此不一定正确,因此执行会绕过IF块的内部并进入ELSE块。