Oracle 取最大值问题求教

zgshifenz 2012-02-27 11:23:20
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个比较后的最大值
这个有什么解决办法?或者其他实现方法啊
...全文
113 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ADCC千月 2012-02-27
  • 打赏
  • 举报
回复
PL/SQL 编个判定吧。
zgshifenz 2012-02-27
  • 打赏
  • 举报
回复
十分感谢3楼 问题解决
guorui0526 2012-02-27
  • 打赏
  • 举报
回复
可以参考三楼办法。

也可以写个funcation,这样更灵活点;如果都在SQL中描述,眼睛疼!
coolkisses 2012-02-27
  • 打赏
  • 举报
回复
用 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


其它情况 类似
zgshifenz 2012-02-27
  • 打赏
  • 举报
回复
先感谢1楼兄弟

我这只是举个例子,如果是10个参数或者更多 那么写函数来判断得有多繁琐

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧