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

时间: 2024-08-07 08:22:39

decode()与case then 学习与使用的相关文章

DECODE 与CASE WHEN 的比较以及用法

1.DECODE 只有Oracle 才有,其它数据库不支持; 2.CASE WHEN的用法, Oracle.SQL Server. MySQL 都支持; 3.DECODE 只能用做相等判断,但是可以配合sign函数进行大于,小于,等于的判断,CASE when可用于=,>=,<,<=,<>,is null,is not null 等的判断; 4.DECODE 使用其来比较简洁,CASE 虽然复杂但更为灵活; 5.另外,在decode中,null和null是相等的,但在case

decode 类似 case when

将查询的结果翻译成其他值,类似 case  when to_char(创建时间,'mm') ='01' then '查询统计的是1月 ' when to_char(创建时间,'mm') ='02' then '查询统计的是2月 ' when to_char(创建时间,'mm') ='03' then '查询统计的是3月 ' ....................... select decode( to_char(创建时间,'mm') , '01' , '查询统计的是1月 ', '02' ,

Oracle nvl、nvl2、nullif、decode、case函数详解

1.NVL函数 nvl(expr1,expr2),如果expr1为空,则返回expr2: 2.NVL2函数 nvl2(expr1,expr2,expr3),如果expr1为空,则返回expr3,否则返回expr2: 3.NULLIF函数 nullif(expr1,expr2),如果expr1=expr2,返回空,否则返回expr1,要求两个表达式数据类型一致: SQL> insert into t1 values(9); 说明1:NVL和NVL2函数在进行空值判断的时候,都会将函数内的表达式执行

Oracle用户登录和连接查询、特殊排序、over()、rank()、decode()、 case when、UNION/UNION ALL

一.登录问题 1. 忘记用户名密码: (1)默认应户名密码: system/manager    sys/change_on_install     scott/tiger (2)cmd以系统管理员身份登录: C:\Users\SAMSUNG>sqlplus system/manager as sysdba 查看所有user: SQL> select username from dba_users; 修改用户密码: SQL> alter user scott identified by

数据库case,when学习

前几天工作中遇到了一个数据库统计相关的东西,主要使用case,when实现,现在说说基本情况: 有两个表school,studens,其中 school表结构如下: students表结构如下: 其中sex=1代表男,sex=2代表女 现要求出现如下的结果集: 学校id,学校名,学校总人数,男生总人数,女生总人数 方案: 1,将school表和students表分别查询统计出学校总人数,男生总人数,女生总人数,然后将结果集拼起来就行了.此方法比较传统,想法简单,但是sql过长. 2.采用case

decode与case when

语法 decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) select * from reglike; select decode(substr(name,1,3),'aaa','yes','no') decode from reglike; 语法 case when 条件1 then 值1 when 条件2 then 值2 ... when 条件n then 值n else 缺省值 end select * from reglike; select case w

decode and CASE

CASE 原文地址:https://www.cnblogs.com/kakaisgood/p/9567378.html

Oracle学习 第8天

真不想写,但还是要逼自已每天学一点,写一点.今晚倒时没玩,一回家就被电话叫到线上处理事情,抽些时间学一些Oracle 1.字符函数,有UPPER.LOWER.INITCAP(首字母大写).REPLACE.LENGTH.SUBSTR.ASCII.CHR.RPAD.LPAD.LTRIM.RTRIM.TRIM.INSTR(子字符串是否在指定位置上出现) 2.验证用的虚拟表:dual,专门用来验证.测试用的(直接SELECT不行吗?一定要FROM DUAL?以后试下) 3.数值函数:ROUND.TRUN

2016.7.10 SqlServer语句中类似decode、substr、instr、replace、length等函数的用法

Decode() 对应 case when函数 case CHARINDEX('/',start_point_name) when 0 then start_point_name else substring(start_point_name,1,CHARINDEX('/',start_point_name)-1) end 注意:sqlserver在用case when判断是否为null时,语法不一样 判断null应该用: case when identifier is null then ai