-- 报 ora-01847错误
  select nvl(a.date1,'-') as date1 from 
  (
  select to_date('2011-01-01','YYYY-MM-DD') as date1 from dual 
  ) a 
  
  ; 
-- 报ora-00932错误
  select (case when a.date1 is not null then a.date1 else '-' end ) as date1  
  from 
  (
  select to_date('2011-01-01','YYYY-MM-DD') as date1 from dual 
  ) a
  
我问过我公司的DBA,他说这样是不行的,oracle 的机制 不允许,有什么方法不?

解决方案 »

  1.   

    因'-'不是日期型的,而你的a.date1是日期型的,因此在同一列上是有矛盾的因此你需要將你的列顯示為字符型才可以
      

  2.   


    --這樣寫
     select decode(a.date1,null,'-',to_char(a.date1,'yyyy-mm-dd hh24:mi:ss')) as date1 from  
      (
      select to_date('2011-01-01','YYYY-MM-DD') as date1 from dual  
      ) a;
      

  3.   


    方法是好,可是sql server 系列的不能用 decode
    而在 sql server 里面 isnull( nvl) 是不会要求 前面的字段和后面的字段类型一样,这是oracle 内置的函数,这没话说,
    可以用 case when 处理,还会有数据类型不一致的错误,这很难理解,
    看来目前只能分别为 
    oracle 和 sql server 分别写
      

  4.   

    呵呵,内置函数是不同declare @date datetime
    select @date=null;
    select case when @date is null then '-' else convert(varchar(10),@date,112) end;
    select @date=getdate();
    select case when @date is null then '-' else convert(varchar(10),@date,112) end;
      

  5.   

    nvl(arg1,arg2)两个参数需要是同一数据类型。所以,你的语句才不能执行。你可以把子查询改为string类型,或者把arg1的类型转换成string类型
      

  6.   

    像isnull,nvl 内置函数那是没办法的事情,
    可是连用 case when 都是这种情况,
    sql server 
    可以用
    ( case when date1 is not null then date1 else '-' end   ) as dateNew1
    但是oracle  
    在用这个 case when 会报类型不一致的错误,就不能理解了,
    我写sql 一般想办法避开版本差异的问题,
    可是连case when 在 sql server 下行,oracle 下不行,颠覆我平时的观念,我不知道是不是哪天其他一些平时习以为常的语句,也会有出现类似的问题。
      

  7.   

    select nvl(a.date1,sysdate) 
    as date1 from  
      (
      select to_date('2011-01-01','YYYY-MM-DD') as date1 from dual  
      ) a  nvl  两个参数数据类型必须一致吧
      

  8.   

    目前不同的SQL厂商,同样的功能,需要不同的实现