今天聊一下,oracle中null的转换的几种方式,和优劣比较。
方式一: nvl() 函数
nvl() 函数是一个空值转换函数,具有两个参数。
表达式: nvl(参数1,参数2)
当参数1不会null值时,返回参数1;
当参数1 为 null 时,则返回 参数2。
--假设字段 xm 为null值
select nvl(xm,'张三') from dual;
--结果返回 张三
--假设字段 xm='李四' 不为null值
select nvl(xm,'张三') from dual;
--结果返回 李四
方式二: nvl2() 函数
nvl2() 函数是同样是一个空值转换函数,具有3个参数,是nvl()函数的升级版。
表达式: nvl2(参数1,参数2,参数3)
当参数1不会null值时,返回参数3;
当参数1 为 null 时,则返回 参数2。
--假设字段 xm 为null值
--假设 xm2 = '李四'
--假设 xm3 = '王五'
select nvl2(xm,xm2,xm3) from dual;
--结果返回xm3 王五
--假设字段 xm='张三' 不为null值
--假设 xm2 = '李四'
--假设 xm3 = '王五'
select nvl2(xm,xm2,xm3) from dual;
--结果返回xm2 李四
方式二: decode() 函数
decode()函数 是一个条件表达式函数,我习惯性的称呼为 翻译函数,顾名思义,decode()函数可以对字段的字典值进行翻译(就是定义这个字典值 表达的意思)。
decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)
简单解释一下,decode(2-1,‘1’,‘答案为1’,‘2’,‘答案为2’,‘系统故障未能计算出结果!’),条件是 2-1,结果是 1,1的翻译值是 答案为1,最终的结果就是 答案为1。
现在说一下,为什么decode()函数也可转换值呢,上语句
--假设字段 xb 为null值时,返回'性别未知',xb不为null值时,返回字段xb的值
--假设xb 为 null值时
select decode(xm,null,'性别未知',xb) from dual;
--结果返回 性别未知
--假设字段 xb 为null值时,返回'性别未知',xb=1 返回 男,xb=2 返回 女
--假设xb =2
select decode(xm,null,'性别未知',1,'男','2','女') from dual;
--结果返回 女
总结:除了这三个函数 case when 判断也可以实现这个效果,但是判断个null值,用上case when 不像是有脑子的人做的,所以这里就不写了。
上述的这三个函数皆可以满足判断null值并对其进行转换,但是decode函数一般不这样用,这里只做普及方法不推荐使用,写语句不但要考虑实现功能,更要考虑到语句的执行性能。
若是只进行判断 null值,推荐使用 nvl() 和 nvl2() 这两个函数。