+ -
当前位置:首页 → 问答吧 → 请问nvl函数不能显示字符怎么处理?

请问nvl函数不能显示字符怎么处理?

时间:2011-12-26

来源:互联网

比如select nvl(0,'未知')from dual
报错:ORA-01722: 无效数字
select nvl(0,'888')from dual 就ok 不知道有没有个函数能判断空值并返回一个默认值(要支持字符的)

不要说自己写一个函数,这个毕竟没有oracle带的方便,要用于移植的

多谢大家了

作者: xhzlhc   发布时间: 2011-12-26

实测结果,


请注意NULL和0的区别。

作者: LuiseRADL   发布时间: 2011-12-27

问题的关键:
使用nlv(exp1,exp2),当exp1和exp2类型不一致的时候,会进行类型转换。
你的例子中,
1.使用nvl(0,'未知'),oracle会将'未知'转换成数字,所以报ORA-01722: 无效数字;
2.使用nvl(0,'888'),会将'888'转换数字,能够正确转换,没有问题。

解决办法:
SQL code

SELECT DECODE(0,NULL,'a',0) FROM DUAL



作者: hudingchen   发布时间: 2011-12-27

NVL(expr1, expr2).
expr1和expr2可以是任何类型。如果2者类型不同,Oracle会进行隐式类型转换。
如果不能进行隐式转换,将会产生一个错误。

隐式转换规则:
如果expr1是字符型,则Oracle在判断之前,将expr2转换为expr1的类型
如果expr1是数字类型,则会判断哪个参数具有最高的数字优先级,然后将另一个参数转化为该类型。

本例中,字符型的数字优先级肯定最低,所以会将后面的字符串转换为数字类型,所以出错。

作者: LuiseRADL   发布时间: 2011-12-27

该回复于2011-12-27 09:13:43被管理员删除

  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • HJ_daxian
  • (不用怀疑,涐就是沵梦中的穷人。)
  • 等 级:
#5楼 得分:0回复于:2011-12-27 10:14:20
DECODE函数应该可以完成转换

作者: LUOYING198791   发布时间: 2011-12-27

用DECODE 吧

作者: HJ_daxian   发布时间: 2011-12-27