oracle查询时根据查询的时间字段改变状态字段的值


        最近在开发的过程中遇到如下一个场景:oracle数据库商品表里面有商品的下线时间字段shelf_time  和状态字段 goods_statu,有个定时任务定时扫描商品表,如果当前商品状态为1(上线状态)且下线时间小于当前时间就改变商品的为0(下线状态),但定时任务不能保证实时性,所以在查询语句要加上这个逻辑判断,下面为解决方案

    select decode(

      (CASE WHEN
        (shelf_time < sysdate AND goods_status = '1' ) THEN -1
      END ),-1,0,goods_status) as goods_status

      from T_GOODS 

用到oracle 的 decode 和 CASE 函数结合完美把问题解决。

decode 函数的基本用法如下:

    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

 CASE 函数的基本用法如下:

  case shelf_time 

  when shelf_time < sysdate  THEN  -1

  when shelf_time = sysdate  THEN  0

  else 1 end