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

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

4

3 回答 3

5

正确的测试是

IF purpose IS NULL THEN

这是因为NULL不是存储在字段中的值。它是 关于存储在其他地方(但在行内)的字段的属性。

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

于 2012-04-19T18:06:43.877 回答
5

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

这是对这个想法的一个很好的概述。摘录:

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

于 2012-04-19T18:08:26.637 回答
1

purpose = null无论是什么,表达式的结果都是未知purpose的(有关更多详细信息,请参阅@Paul Sasik 的答案)。既然是未知的,也不一定是真的,所以执行绕过了块的内部,IF落入了ELSE块中。

于 2012-04-19T18:24:05.243 回答