这个实现SQL-92是否符合要求?

DCo*_*kie 5 sql oracle plsql

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?

Ton*_*ews 3

不,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 是相同的事物!