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