• decode()与case then 学习与使用


    今天做项目的时候遇到一个oracle数值转换的问题,按需求需要对匹配系统时间进行固定赋值,为了避免增加复杂度并易于维护,尽量不要使用存储过程或触发器,最好是使用oracle 自带函数。

    如:

    SQL> select to_char(sysdate,'yyyyMMddhh24mi') as time from dual;

    TIME
    ------------
    201602292302

    需要对年月日时分的分做判断,若系统时间分钟值大于或等于30,则值固定为30 ,若值小于30 则判断为0;

    首先想到的是用 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

    然后发现只是值的判断而已,使用decode 的确可以实现,但无疑造成很大的麻烦,比写个存储过程或触发器还麻烦复杂。

    找了下资料,发现可以用oracle的 when case then else end  表达式:

    Case when 的用法,简单Case函数 
    简单CASE表达式,使用表达式确定返回值.

      语法:

      CASE search_expression

      WHEN expression1 THEN result1

      WHEN expression2 THEN result2

      ...

      WHEN expressionN THEN resultN

      ELSE default_result

     搜索CASE表达式,使用条件确定返回值.

      语法:

      CASE

      WHEN condition1 THEN result1

      WHEN condistion2 THEN result2

      ...

      WHEN condistionN THEN resultN

      ELSE default_result

      END

    然后,测试是否可行:

    SQL> select case when to_char(sysdate,'mi')>=30 then 30 else 0 end Decide from dual ;

    DECIDE
    ----------
    30

    最后按项目需要的sql为:

    SQL> select to_char(sysdate,'yyyyMMddhh24')||''||Decide as time from dual,
    2 ( select case when to_char(sysdate,'mi')>=30 then '30' else '00' end Decide from dual ) a ;

    TIME
    ------------
    201602292300

  • 相关阅读:
    枚举扩展,感觉用处很大
    基础缓存操作类
    ASP.NET 4.0 全局取消表单危险字符验证
    拦截所有经过IOC的方法
    关于使用EPPlus插入列,名称管理器公式失效问题案列分析
    IocFactory容器实体
    线程扩展
    IEnumerable扩展支持Add,Remove等操作
    自定义特性。配合枚举使用棒棒哒
    在数据仓储的情况下进一步封装数据库基础操作,此版本为异步版本
  • 原文地址:https://www.cnblogs.com/illusioned/p/5229303.html
Copyright © 2020-2023  润新知