有没有好心人,帮帮忙

MyHoliday1104 2014-03-21 05:08:15
需要比较A,B 两个时间类型的字段,

当A为空时,取B值;
当B为空时,取A值;
A与B比较时,取小的那个值。

怎么写啊,好心人,帮帮忙吧!!!
...全文
246 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
WSZHAO_SELECT 2014-04-02
  • 打赏
  • 举报
回复
1 GREATEST 返回值列表中最大值 格式: GREATEST(value1, value2, value3, ...) 含义: 返回value列表最大的值。 value列表必须是相同类型,也可以是一个表的同一行、不同列的值进行比较。 当value值列表中有一个为NULL,则返回NULL值。 EXAMPLE: select greatest (1, 3, 2 ) from dual ; -- 返回3 select greatest ( 'A', 'B', 'C' ) from dual ; -- 返回C select greatest (null, 'B', 'C' ) from dual ; -- 返回null select greatest (t.empno, t.mgr ) from scott.emp t ; -- 返回empno和mgr 较大值 2. LEAST 返回值列表中最小值 格式: LEAST(value1, value2, value3, ...) 含义: 返回value列表最小的值。 value列表必须是相同类型,也可以是一个表的同一行、不同列的值进行比较。 当value值列表中有一个为NULL,则返回NULL值。 EXAMPLE: select least (1, 3, 2 ) from dual ; -- 返回1 select least ( 'A', 'B', 'C' ) from dual ; -- 返回A select least (null, 'B', 'C' ) from dual ; -- 返回null select least (t.empno, t.mgr ) from scott.emp t ; -- 返回empno和mgr 较小值 nvl(a,b)----如果a is null 则就取b select least(nvl(null,'b'),nvl(null,'a')) from dual结果就是a
卖水果的net 2014-03-29
  • 打赏
  • 举报
回复
引用 10 楼 wmxcn2000 的回复:
select greatest(nvl(a,b),nvl(b,a)) from dual 
这个吧,还算简单。
上面是取大的,下面是取小的。
select least(nvl(a,b),nvl(b,a)) from dual 
卖水果的net 2014-03-29
  • 打赏
  • 举报
回复
select greatest(nvl(a,b),nvl(b,a)) from dual 
这个吧,还算简单。
Gemini Dean 2014-03-24
  • 打赏
  • 举报
回复
oracle函数的组合使用,膜拜
walkeeper 2014-03-24
  • 打赏
  • 举报
回复
膜拜一下大神的写法~
善若止水 2014-03-23
  • 打赏
  • 举报
回复
引用 1 楼 hidanger521 的回复:
[quote=引用 楼主 u012167407 的回复:] 需要比较A,B 两个时间类型的字段, 当A为空时,取B值; 当B为空时,取A值; A与B比较时,取小的那个值。 怎么写啊,好心人,帮帮忙吧!!!

WITH test AS(
SELECT to_date('2014-03-21','yyyy-mm-dd') a,to_date('2014-03-21','yyyy-mm-dd') b FROM dual UNION ALL
SELECT to_date('2014-03-19','yyyy-mm-dd') a,to_date('2014-03-11','yyyy-mm-dd') b FROM dual UNION ALL
SELECT NULL a,to_date('2014-03-21','yyyy-mm-dd') b FROM dual UNION ALL
SELECT to_date('2014-03-21','yyyy-mm-dd') a,NULL b FROM dual )
SELECT decode(greatest(a,b),a,b,b,a) FROM test
[/quote] 佩服,佩服,思路很好
sqiong 2014-03-23
  • 打赏
  • 举报
回复
select decode(a.XX,null,b.XX,decode(sign(a.xx-nvl(b.xx,a.xx-1)),a.xx,b.xx)) from a,b 大致这个意思。
abin30 2014-03-23
  • 打赏
  • 举报
回复
再给一种解法:
WITH ta AS
(
SELECT 1 a,2 b FROM dual UNION ALL
SELECT 2 a,1 b FROM dual UNION ALL
SELECT 1 a,NULL b FROM dual UNION ALL
SELECT NULL a,NULL b FROM dual UNION ALL 
SELECT NULL a,1 b FROM dual
)
SELECT coalesce (LEAST(a,b),a,b) FROM ta
hello_world1 2014-03-21
  • 打赏
  • 举报
回复
snbxp的可以有。
snbxp 2014-03-21
  • 打赏
  • 举报
回复


WITH ta AS
(
SELECT 1 a,2 b FROM dual UNION ALL
SELECT 2 a,1 b FROM dual UNION ALL
SELECT 1 a,NULL b FROM dual UNION ALL
SELECT NULL a,NULL b FROM dual UNION ALL 
SELECT NULL a,1 b FROM dual
)
SELECT LEAST(NVL(b,a),NVL(a,b)) FROM ta
流浪川 2014-03-21
  • 打赏
  • 举报
回复
decode(greatest(a,b),a,b,b,a) 和你说一下原理哈。。这个函数是比大小取大值。。另外因为如果ab存在null时候该函数返回null. 所以放在decode里面做相反取值非常合适。 谁大就去另一个值,谁是null也是取另一个值。。
流浪川 2014-03-21
  • 打赏
  • 举报
回复
引用 楼主 u012167407 的回复:
需要比较A,B 两个时间类型的字段, 当A为空时,取B值; 当B为空时,取A值; A与B比较时,取小的那个值。 怎么写啊,好心人,帮帮忙吧!!!

WITH test AS(
SELECT to_date('2014-03-21','yyyy-mm-dd') a,to_date('2014-03-21','yyyy-mm-dd') b FROM dual UNION ALL
SELECT to_date('2014-03-19','yyyy-mm-dd') a,to_date('2014-03-11','yyyy-mm-dd') b FROM dual UNION ALL
SELECT NULL a,to_date('2014-03-21','yyyy-mm-dd') b FROM dual UNION ALL
SELECT to_date('2014-03-21','yyyy-mm-dd') a,NULL b FROM dual )
SELECT decode(greatest(a,b),a,b,b,a) FROM test

17,377

社区成员

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

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