空字符串’’与 null 的关系
空字符串 ‘’ 等价于 null,不过有些人喜欢钻牛角尖,所以我改一下说法,空字符串 ’’ 是 null 的字符类型的表现格式。
证明空字符串就是 null 是很容易的:
上面三个 SQL 语句,任意一个都足以证明空字符串 ‘’ 就是 NULL。
有些人可能会说,既然 空字符串’’ 就是 NULL,为什么不能进行 is ‘’ 的判断呢 ?
其实从上面的错误信息就可以看到答案。原因就是 is null 是 Oracle 的语法,在 Oracle 运行的时刻 ’’ 是 null,但是现在 Oracle 还没有运行这条 SQL,就由于语法不正确被 SQL 分析器挡住了。Oracle 的语法并不包含 is ’’ 的写法,所以,这一点并不能成为 ’’ 不是 NULL 的理由。
那么为什么要说 ’’ 是 null 的字符表示形式呢:因为 ’’ 和 null 还确实不完全一样,对于 null 来说,它表示了各种数据类型的 null 值。而对于空字符串’’来说,虽然它也具有 null 的可以任意转化为其他任何数据类型的特点,但是无论是从形式上还是从本质上它都表现出了字符类型的特点。
create or replace package p_test_null is
function f_return(para_in number) return varchar2;
function f_return(para_in varchar2) return varchar2;
end;
/
--创建重载方法,系统自动判断参数类型调用方法
create or replace package body p_test_null is
function f_return(para_in number) return varchar2 is
begin
return 'number';
end;
function f_return(para_in varchar2) return varchar2 is
begin
return 'varchar2';
end;
end;
/
结果如下:
利用重载的原理,字符类型输出 varchar2,而数值类型输出 number。输入为空字符串 ‘’ 时,输出为varchar2,从这一点上可以看出字符串 ‘’ 实际上已经具备了数据类型。所以我将 ’’ 表述为空字符串是 null 的字符类型表现形式。
根据 除了 is null、is not null 以外,对 null 的任何操作的结果还是null
可得 null || ‘A’ 应该为 null。但实际结果为如下图:
认为空字符串 ‘’ 是字符形式的 NULL,那么 || 操作的结果就不难理解了。