decode()与case then 学习与使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于decode()与case then 学习与使用的主要内容,如果未能解决你的问题,请参考以下文章

decode&case

Oracle Sql关于case-when,if-then,decode

SQL中的decode及case when的用法

Oracle特有函数 case when decode exists 分页rownum

数据库case when和decode用法以及区别

DECODE 与CASE WHEN 的比较以及用法