Oracle 先判断是否为空,然后对非空数据做计算(DECODE比较大小)

需求

 

对某时间指标做分类,如果工单未完成(结束时间为空),则为“未结单”;否则,若工单超时,则为“未达标”;其余则为“达标”。

可见,指标结果分为3类:
未结单=COMPLETE_TIME IS NULL
达标=COMPLETE_TIME IS NOT NULL AND COMPLETE_TIME<=PLAN_FINISHED_TIME
未达标=COMPLETE_TIME IS NOT NULL AND COMPLETE_TIME>PLAN_FINISHED_TIME

数据

Oracle 先判断是否为空,然后对非空数据做计算(DECODE比较大小)_第1张图片

方法

首先,利用NVL2()函数,判断COMPLETE_TIME是否为空,为空则'未结单';

然后,利用DECODE()函数和SIGN()函数,判断差值是否大于0,大于0则为'未达标',否则为'达标'。

其中

  • NVL2(表达式1,表达式2,表达式3)

        3目表达式,如果'表达式1'为空,则返回'表达式3'的值;如果'表达式1'不为空,则返回'表达式2'的值。注意顺序与NVL()的区别。

  • DECODE(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)

        多目表达式,此处只用到一种判断值,即DECODE(表达式,值,返回值,缺省值)。

        如果,'表达式'等于'值',则返回'返回值',否则返回'缺省值'。

        但是,DECODE只能判断是否相等,无法比较大小,可以与SIGN函数组合,实现比较大小的目的。

  • SIGN(value)

        SIGN(value)函数会根据value的值为0,正数,负数,分别返回0,1,-1

综上可见,通过sign对需要比较大小的式子做转换,得到0,1,-1后,即可以用decode来判断。

由于此场景只需要判断差值大于0还是小于等于0,共2种情况,所以按照下述方法可以实现目的。

SELECT
    SIGN(COMPLETE_TIME-PLAN_FINISHED_TIME) AS SIGN_FLAG,
    NVL2(COMPLETE_TIME, DECODE(SIGN(COMPLETE_TIME-PLAN_FINISHED_TIME), 1, '未达标', '达标'), '未结单') AS STATE
FROM
    PLAN

结果

Oracle 先判断是否为空,然后对非空数据做计算(DECODE比较大小)_第2张图片

你可能感兴趣的:(SQL,oracle,数据库,sql)