比如select nvl(0,'未知')from dual
报错:ORA-01722: 无效数字
select nvl(0,'888')from dual 就ok  不知道有没有个函数能判断空值并返回一个默认值(要支持字符的)不要说自己写一个函数,这个毕竟没有oracle带的方便,要用于移植的多谢大家了

解决方案 »

  1.   

    实测结果,
    请注意NULL和0的区别。
      

  2.   

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

  3.   

    NVL(expr1, expr2).
    expr1和expr2可以是任何类型。如果2者类型不同,Oracle会进行隐式类型转换。
    如果不能进行隐式转换,将会产生一个错误。隐式转换规则:
    如果expr1是字符型,则Oracle在判断之前,将expr2转换为expr1的类型
    如果expr1是数字类型,则会判断哪个参数具有最高的数字优先级,然后将另一个参数转化为该类型。本例中,字符型的数字优先级肯定最低,所以会将后面的字符串转换为数字类型,所以出错。
      

  4.   

    select nvl(0,'未知')from dual
    中的字符数据类型不同,所以报错!!
      

  5.   

    0是数值型,当然不能转
    NVL(C1,'未知')
    如果是将数字0转成未知就DECODE
    decode(0,‘未知’)
      

  6.   


    --这样写
    select nvl('0','未知') from dual
      

  7.   


    --这样写
    select nvl('0','未知') from dual
      

  8.   

    马白了  谢谢大家了呵呵深夜不能入眠 起来学习 hoho