**********************nvl
Oracle中的空字符串基本上是被当成空NULL来处理的
selectnvl('','NULL') from dual 返回'NULL'
select 1 from dual where '' is null 返回1。
如果我们在往数据表里插数据的时候,把某个值赋成空串(''),而查询条件加入了诸如col_x= ''等条件的话,结果是无法查出来的。
反过来,在使用||连接符时,NULL值又被当作空串来使用。
select null || 'ce'|| null ||'shi' from dual将返回串’ceshi’。
然而,空串''与空值NULL还是有些区别的
select 1 from dualwhere '' = null; 返回0行
select 1 from dualwhere null = ''; 返回0行
select 1 from dualwhere '' is null; 返回1行 结果为:1
select 1 from dualwhere null is ''; 报错缺失null关键字
declare a varchar(10);
b varchar(10);
c varchar(10);
begin
a := '';
b := null;
c := a;
dbms_output.put_line(a);
dbms_output.put_line(b);
if (a is null) then
dbms_output.put_line('yes') ;
else dbms_output.put_line('no') ;
end if;
if (b is null) then
dbms_output.put_line('yes') ;
else dbms_output.put_line('no') ;
end if;
if (c is null) then
dbms_output.put_line('yes') ;
else dbms_output.put_line('no') ;
end if;
-- if (nvl(a,'@') = nvl(c,'@')) then
if (a = c) then
dbms_output.put_line('yes') ;
else dbms_output.put_line('no') ;
end if;
dbms_output.put_line(c) ;
end;
结果为:yes yes yes no
“if (a = c) then”=替换为< 或> 结果不变
注释处替换后为yes yes yes yes
也就是说因为oracle认为空串就是null 所以赋值后,abc都是null但是由于null不参与任何=,<,> 运算。所以都是no。想做比较必须处理。(nvl只是其中一种)