日期:2014-05-16 浏览次数:20384 次
如果要在Oracle数据库的select子句中实现字段值的大小比较,可以使用case end和decode函数实现。
例如,查询出某个表的3个小时以上的处理统计数据,2个小时以内的处理统计数据,1个小时以内的处理统计数据的SQL语句。
使用case end函数可以实现如下:
select t.custommgrid, count(case when (t.createtime - t.firstdealtime) >= 3 / 24 then t.dealflag else null end) as threehour_things, count(case when (t.createtime - t.firstdealtime) < 2 / 24 then t.dealflag else null end) as twohour_things, count(case when (t.createtime - t.firstdealtime) < 1 / 24 then t.dealflag else null end) as onehour_things, count(t.dealflag) as all_things from tb_name t where t.dealflag = 1 group by t.custommgrid;
?
使用decode函数可以实现如下:
select count(decode(sign((t.createtime - t.firstdealtime) - 3 / 24), -1, null, t.dealflag)) as threehour_things, count(decode(sign((t.createtime - t.firstdealtime) - 2 / 24), -1, t.dealflag, null)) as twohour_things, count(decode(sign((t.createtime - t.firstdealtime) - 1 / 24), -1, t.dealflag, null)) as onehour_things, count(t.dealflag) as all_things from tb_name t where t.dealflag = 1 group by t.custommgrid;
?
decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
该函数的实现逻辑是这样:
IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2) ......
ELSIF 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END IF
?
(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1716817 )
使用case end可以直接得出比较值,大小一清二楚;而使用decode要使用sign可以一次转换,增加了一弯来绕。这是因为decode函数只能做等值比较。
因此,对于此类需求,最好还是使用case end来实现。
?
?
?