select greatest(i.Fdate,u.Fdate,p.Fdate) from table_a i,table_b u,table_c p
i.Fdate,u.Fdate,p.Fdate都是DATE类型
若i.Fdate是空值 u.Fdate,p.Fdate不为空  那么这个greatest就会出现 只能取得空值 我想达到 i.Fdate,u.Fdate,p.Fdate都为空  那么就取空值  
其中一个不为空就取该值 
若是 其中1个为空 则取其余2个比较后的最大值 
这个有什么解决办法?或者其他实现方法啊

解决方案 »

  1.   

    用 nvl + greatest + case when 试试实现原理
         nvl(字段, 历史上最小的那天,如公元一年)
         —> greatest (nvl 之后的所有字段)
         —>  case when 公元一年,换回 空值
    WITH tmp AS
    (
         --SELECT NULL a_date, SYSDATE b_date, SYSDATE + 1 c_date FROM dual
         SELECT NULL a_date, NULL b_date, NULL c_date FROM dual
    )SELECT CASE WHEN 
            greatest(
                   nvl(a_date,to_date('00010101 00:00:00','YYYYMMDD HH24:MI:SS'))
                   ,nvl(b_date,to_date('00010101 00:00:00','YYYYMMDD HH24:MI:SS'))
                   ,nvl(c_date,to_date('00010101 00:00:00','YYYYMMDD HH24:MI:SS'))
                   ) = to_date('00010101 00:00:00','YYYYMMDD HH24:MI:SS')
                   THEN NULL 
                   ELSE greatest(
                   nvl(a_date,to_date('00010101 00:00:00','YYYYMMDD HH24:MI:SS'))
                   ,nvl(b_date,to_date('00010101 00:00:00','YYYYMMDD HH24:MI:SS'))
                   ,nvl(c_date,to_date('00010101 00:00:00','YYYYMMDD HH24:MI:SS'))
                   )
                   END
                FROM tmp
    其它情况 类似
      

  2.   

    可以参考三楼办法。也可以写个funcation,这样更灵活点;如果都在SQL中描述,眼睛疼!