Tony Andrews在另一个问题中给出了一个例子:
IF p_c_courtesies_cd
|| p_c_language_cd
|| v_c_name
|| v_c_firstname
|| v_c_function
|| p_c_phone
|| p_c_mobile p_c_fax
|| v_c_email is not null
THEN
-- Do something
END IF;
Run Code Online (Sandbox Code Playgroud)
作为Oracle COALESCE函数的一个聪明(如果不是有点模糊)的替代品.果然,它有效,如果任何参数不为null,则IF测试为真.我的问题:Oracle的上述串联操作SQL-92的实现是否符合要求?涉及NULL的表达式不应该计算为NULL吗?如果您不这么认为,为什么表达式1 + NULL计算为NULL?
不,Oracle 对 null 的处理方式很特殊,与其他人不同,并且与 ANSI 标准不一致。然而,Oracle 辩称,它很可能早在 ANSI 标准出现之前就决定并致力于这种处理方式!
这一切都始于 Oracle 存储字符串的事实,其中包含字符计数,后跟字符串数据。NULL 表示字符数为零且没有后续字符串数据 - 这与空字符串 ('') 完全相同。Oracle 根本没有办法区分它们。
这会导致一些奇怪的行为,例如这个串联案例。Oracle 也有一个函数 LENGTH 来返回字符串的长度,但是它是以相反的方式定义的,因此 LENGTH('') 返回 NULL 而不是零。所以:
LENGTH('abc') + LENGTH('') IS NULL
LENGTH('abc' || '') = 3
Run Code Online (Sandbox Code Playgroud)
在我看来,这违反了基本的数学原理。
当然,Oracle 开发人员已经习惯了这一点,以至于我们中的许多人甚至看不出它有什么错误或奇怪的地方 - 有些人实际上会认为世界其他地方都是错误的,空字符串和 NULL 是相同的事物!
| 归档时间: |
|
| 查看次数: |
1399 次 |
| 最近记录: |