select  add_months(start,decode(month,null,0,month)) from table

解决方案 »

  1.   

    nvl(month,0)不就可以了,或者用你的select add_months(start,to_number(nvl(month,'0'))) from table
     
      

  2.   

    不用那么麻烦,你写的类型转换有问题吧?
    如下就可以with tab as (
    select '2012-01-01' yearF, null monthS from dual
    union all
    select '2012-01-01' yearF, '2' monthS from dual)
    select add_months(yearF, nvl(monthS, '0')) from tab--结果
    -------------------------------------------------------
    1 2012/01/01
    2 2012/03/01
      

  3.   

    这样查询的结果还是null。只要month是null出来的结果也是。
      

  4.   

    oracle 会自动转换数字型字符串的select add_months(start,nvl(month,'0')) from table 怎么会错嘛
      

  5.   


    我知道你的是怎么回事了!
    你的DB中存的是<NULL>,不是null
    我以前做sqlserver的时候遇到过这个情况,这个算是函数的一个bug吧,需要手动判断下null
    用下面的sql
    with tab as ( select '2012-01-01' yearF, null monthS from dual union all select '2012-01-01' yearF, '2' monthS from dual   ) 
    select 
    (case when monthS is null then yearF else to_char(add_months(yearF, monthS), 'yyyy-MM-DD') end) from tab