专栏首页小麦苗的DB宝专栏【DB笔试面试455】条件表达式CASE和DECODE的区别是什么?

【DB笔试面试455】条件表达式CASE和DECODE的区别是什么?

题目部分

条件表达式CASE和DECODE的区别是什么?

答案部分

在SQL语句中使用IF-THEN-ELSE逻辑,可以使用两种方法:CASE表达式、DECODE函数。

1、CASE表达式

SQL中CASE的使用方法具有两种格式:简单CASE函数和CASE搜索函数。

简单CASE函数使用方式如下所示:

CASE SEX 
         WHEN '1' THEN '男' 
         WHEN '2' THEN '女' 
ELSE '其它' END AS "类别"
CASE搜索函数使用方式如下所示:
CASE WHEN SEX = '1' THEN '男' 
      WHEN SEX = '2' THEN '女' 
ELSE '其它' END AS "类别" 

以上两种方式可以实现相同的功能。简单CASE函数的写法相对比较简洁,但是和CASE搜索函数相比,功能方面会有些限制,例如编写判断式,下面的例子无法使用简单CASE函数来实现:

CASE WHEN SEX = '1' AND AGE>60 THEN  '爷爷'
      WHEN SEX = '2' AND AGE>60 THEN '奶奶' 
ELSE '其它' END AS "类别"

需要注意的是,CASE函数只返回第一个符合条件的值,剩下的CASE部分将会被自动忽略。例如下面的SQL语句,永远无法得到“第二类”这个结果。

CASE WHEN COL_1 IN ( 'A', 'B') THEN '第一类' 
         WHEN COL_1 IN ('A')       THEN '第二类' 
ELSE '其它' END AS "类别"

CASE表达式可以在SQL中实现IF-THEN-ELSE型的逻辑,而不必使用PL/SQL。CASE的工作方式与DECODE类似,但推荐使用CASE,因为它与ANSI兼容。

对于CASE表达式,需要注意以下几点内容:

(1)以CASE开头,以END结尾。

(2)分支中WHEN后跟条件,THEN为显示结果。

(3)ELSE为除此之外的默认情况,类似于高级语言程序中SWITCH CASE的DEFAULT,可以不加。

(4)END AS后跟别名,也可以去掉AS。

2、DECODE函数

DECODE的语法如下所示:

DECODE(VALUE,IF1,THEN1,IF2,THEN2,IF3,THEN3,...,ELSE),表示如果VALUE等于IF1,那么DECODE函数的结果返回THEN1,...,如果不等于任何一个IF值,那么返回空。

在使用DECODE函数时,需要注意以下几点内容:

(1)Oracle在调用DECODE函数的时候,需要预先确定列的类型。

(2)确定DECODE返回值类型,是依据参数中第一个条件返回类型,之后所有的返回类型都依据第一个类型进行强制类型转换。

(3)当Oracle在第一个条件返回类型为NULL的时候,默认将其作为字符串处理。

例如,下面的例子中,DECODE函数的返回值以SAL列为标准,即为数值型,而7499的返回值为字符串,所以,会报错:

SYS@lhrdb> SELECT * FROM SCOTT.EMP M WHERE M.EMPNO IN (7369, 7499);
     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
      7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30

如下的SQL语句会报错(ORA-01722: invalid number):

SELECT DECODE(M.EMPNO, 7369, M.SAL, 7499, M.JOB)
  FROM SCOTT.EMP M
 WHERE M.EMPNO IN (7369, 7499);

若修改为如下形式,将SAL的列变为字符串就可以正常运行了。

SELECT DECODE(M.EMPNO, 7369, M.SAL||'', 7499, M.JOB)
  FROM SCOTT.EMP M
 WHERE M.EMPNO IN (7369, 7499);

本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。

About Me:小麦苗

● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

本文分享自微信公众号 - DB宝(xiaomaimiaolhr),作者:小麦苗best

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【DB笔试面试420】随意说说你觉得Oracle最有意思的部分或者最困难的部分?

    根据个人情况来回答,比如数据库的备份、恢复和性能调优经验明显不足,自然觉得有些困难。基于Oracle的研究应该是个宽广的领域,所以我觉得还是有意思的。

    小麦苗DBA宝典
  • 【DB笔试面试697】在Oracle中,V$SESSION视图中有哪些比较实用的列?

    讲到Oracle的会话,就必须首先对V$SESSION这个视图中的每个列都非常熟悉。该视图在Oracle 11gR2下包含97列,在Oracle 12cR2下增...

    小麦苗DBA宝典
  • 【DB笔试面试661】在Oracle中,在新建或重建索引时有哪些锁?

    不带ONLINE的新建或重建索引的SQL语句获取的是4级TM锁,它会阻塞任何DML操作。

    小麦苗DBA宝典
  • C++核心准则C.126:抽象类通常不需要构造函数‍

    C.126: An abstract class typically doesn't need a constructor

    面向对象思考
  • sql带条件查找最小缺失编号

      查找在CASE_SET_ID为某个条件下的最小缺失编号 如 1 3 获取的值是2 , 2 3则获取的值是...

    cfs
  • php一次性大量数据入库解决方法

    当有业务需求需要一次性循环n条数据,插入或更新数据库时,如果单纯的循环,插入/更新,会消耗太多的数据库资源

    仙士可
  • 喂,快给我打一个小程序预览码

    开发小程序的朋友们随时都会听到一句话:“喂,快给我打一个xxx环境的预览码”,无论你正在干什么,都得赶紧地回一句:“稍等,这就给你打码……”

    程序员宝库
  • 供应链金融必知供应链的八大基本原理

    资源横向集成原理揭示的是新经济形势下的一种新思维。该原理认为,在经济全球化迅速发展的今天,企业仅靠原有的管理模式和自己有限的资源,已经不能满足快速变化的市场对企...

    数商云
  • poj2001

    第一个不依靠模板拍出来的字典树,题目比较水,开始空间没开对WA了无数次,纠结了一个多小时 #include<iostream> #include<cstdio>...

    triplebee
  • Golang基础之数组 转

    数组是同一类型元素的集合。例如,整数集合 5,8,9,79,76 形成一个数组。Go 语言中不允许混合不同类型的元素,例如包含字符串和整数的数组。(注:当然,如...

    双面人

扫码关注云+社区

领取腾讯云代金券