字符长度函数在ORACLE和SQLSERVER中判断空值('')的差别

摘要:字符长度函数在ORACLE和SQLSERVER中判断空值('')的差别

1、ORACLE环境中
代码:

declare v_var varchar2(500) default('');
begin
  for x  in (select object_name from all_objects where rownum<20 order by owner,object_name)
  loop
    v_var := v_var || case when length(v_var)=0 then '' else ',' end || x.object_name;
  end loop;
  dbms_output.put_line(v_var);
end;
 
-------执行结果--------------------------------------
很明显,我原本的初衷就是避免逗号出现在结果的开头,却事与愿违。学习ORACLE的时间不长,不少都是依赖SQLSERVER的SQL经验。
看SQLSERVER的代码测试:
--SQLSERVER
declare @result varchar(10)='';
select len(@result),datalength(@result);
--------------执行结果-------------------------------------
 
经过测试得知,对于空值(‘’,不是null),在ORACLE里用length判断,它的长度是null;在SQLSERVER里用len和datalength都是0,存在不同的返回值。
知道了原因,这样修改代码如下(ORACLE环境):
declare v_var varchar2(500) default('');
begin
  for x  in (select object_name from all_objects where rownum<20 order by owner,object_name)
  loop
    v_var := v_var || case when length(v_var)>0 then ',' else '' end || x.object_name;
  end loop;
  dbms_output.put_line(v_var);
end;
---------执行结果------------------------------
通过这件事,看来虽有SQL_XX标准,各数据库供应商处理细节迥异,学习一门语言,还是先要从基础扎实开始,多练习。