Oracle中decode函数用法详解

一、Oracle数据库decode函数

Oracle数据库提供了decode函数,该函数可以在条件成立时返回一个表达式,否则返回另一个表达式。其语法如下:

decode(expr, search1, result1 [, search2, result2, ...,] [, default])

其中,expr表示待比较的值,可以是任意数据类型,search1, search2, …是待匹配的值,result1, result2, …是匹配成功时返回的结果。如果没有匹配成功,可以使用可选参数default来设置默认返回结果。需要注意的是,decode函数的参数个数必须满足如下条件:

  • 如果有default参数,则参数个数必须为偶数
  • 如果没有default参数,则参数个数必须为奇数

下面给出一个示例,用于说明该函数的基本用法:

SELECT ename, hiredate, 
    decode(job ,'CLERK', '办事员', 'SALESMAN', '销售员', 'MANAGER', '经理', 'PRESIDENT', '总裁', '未知') AS job_zh 
FROM emp;

上述SQL语句将查询emp表中每个员工的姓名、入职时间和职位名称的中文翻译,结果如下:

ENAME       HIREDATE   JOB_ZH    
----------  --------- ---------
SMITH       17-DEC-80  办事员   
ALLEN       20-FEB-81  销售员   
WARD        22-FEB-81  销售员   
JONES       02-APR-81  经理     
MARTIN      28-SEP-81  销售员   
BLAKE       01-MAY-81  经理     
CLARK       09-JUN-81  经理     
KING        17-NOV-81  总裁     
TURNER      08-SEP-81  销售员   
JAMES       03-DEC-81  办事员   
FORD        03-DEC-81  经理     
MILLER      23-JAN-82  办事员   

二、Oracle decode函数判断条件空

如果需要对NULL值进行判断,可以使用decode函数。例如,下面的SQL语句将查询emp表中每个员工的姓名、薪水和是否超过平均薪水的标识:

SELECT ename, sal, 
    decode(sign(sal - avg_sal), -1, '低于平均薪水', 0, '等于平均薪水', 1, '高于平均薪水', '未知') AS sal_flag 
FROM emp, (SELECT round(avg(sal)) AS avg_sal FROM emp);

上述SQL语句中使用了sign函数来比较薪水和平均薪水的大小,并将结果传递给decode函数进行判断,结果如下:

ENAME       SAL   SAL_FLAG     
----------  ----  ------------
SMITH        800   低于平均薪水
ALLEN       1600   高于平均薪水
WARD        1250   等于平均薪水
JONES       2975   高于平均薪水
MARTIN      1250   等于平均薪水
BLAKE       2850   高于平均薪水
CLARK       2450   高于平均薪水
KING       10000   高于平均薪水
TURNER      1500   高于平均薪水
JAMES        950   低于平均薪水
FORD       3000   高于平均薪水
MILLER      1300   等于平均薪水

三、Oracle中decode函数

如果需要在多个条件下返回不同的值,可以使用decode函数的嵌套。例如,下面的SQL语句将查询emp表中每个员工的姓名、薪水和是否是高薪者的标识:

SELECT ename, sal, 
    decode(sign(sal - 3000), -1, '普通员工', 
        decode(sign(sal - 5000), -1, '中层干部', 
            decode(sign(sal - 8000), -1, '高级管理人员', '未知'))) AS sal_type
FROM emp;

上述SQL语句中使用了嵌套的decode函数,在三个条件下分别返回不同的值,结果如下:

ENAME       SAL     SAL_TYPE          
----------  ------  -----------------
SMITH        800    普通员工          
ALLEN       1600    普通员工          
WARD        1250    普通员工          
JONES       2975    普通员工          
MARTIN      1250    普通员工          
BLAKE       2850    普通员工          
CLARK       2450    普通员工          
KING       10000    高级管理人员      
TURNER      1500    普通员工          
JAMES        950    普通员工          
FORD       3000    中层干部          
MILLER      1300    普通员工          

四、Oracle decode函数的用法

除了以上的用法之外,还可以在decode函数中使用其它表达式。例如,下面的SQL语句将查询emp表中每个员工的姓名、薪水和是否是高薪者的标识:

SELECT ename, sal, 
    decode(sign(sal - 3000), -1, '普通员工', 
        decode(sign(sal - 5000), -1, '中层干部', 
            decode(sign(sal - 8000), -1, '高级管理人员', 
                decode(sal, 10000, '总裁', '未知')))) AS sal_type
FROM emp;

上述SQL语句中,第四个参数使用了一个简单的条件判断,结果如下:

ENAME       SAL     SAL_TYPE          
----------  ------  -----------------
SMITH        800    普通员工          
ALLEN       1600    普通员工          
WARD        1250    普通员工          
JONES       2975    普通员工          
MARTIN      1250    普通员工          
BLAKE       2850    普通员工          
CLARK       2450    普通员工          
KING       10000    总裁          
TURNER      1500    普通员工          
JAMES        950    普通员工          
FORD       3000    中层干部          
MILLER      1300    普通员工          

五、Oracle decode用法

除了上述用法之外,还有一些高级用法,例如在decode函数中使用子查询,或者在decode函数中使用字符串函数。例如,下面的SQL语句将查询emp表中每个员工姓名和入职日期,并根据入职月份返回季度的名称:

SELECT ename, hiredate, 
    decode(to_char(hiredate, 'MM'), 
            '01', '第一季度', 
            '02', '第一季度', 
            '03', '第一季度', 
            '04', '第二季度', 
            '05', '第二季度', 
            '06', '第二季度', 
            '07', '第三季度', 
            '08', '第三季度', 
            '09', '第三季度', 
            '10', '第四季度', 
            '11', '第四季度', 
            '12', '第四季度', 
            '未知') AS quarter 
FROM emp;

上述SQL语句中使用了to_char函数将hiredate字段转换成月份,然后使用decode函数返回季度名称,结果如下:

ENAME       HIREDATE   QUARTER           
----------  --------- -------------------
SMITH       17-DEC-80 第四季度       
ALLEN       20-FEB-81 第一季度       
WARD        22-FEB-81 第一季度       
JONES       02-APR-81 第二季度 
MARTIN      28-SEP-81 第三季度    
BLAKE       01-MAY-81 第二季度 
CLARK       09-JUN-81 第二季度
KING        17-NOV-81 第四季度
TURNER      08-SEP-81 第三季度
JAMES       03-DEC-81 第四季度
FORD        03-DEC-81 第四季度
MILLER      23-JAN-82 第一季度

六、Oracle decode函数MySQL

MySQL数据库也提供了类似于Oracle的decode函数,其语法如下:

CASE expr WHEN search1 THEN result1 [WHEN search2 THEN result2 ...] [ELSE default] END

其中,expr表示待比较的值,可以是任意数据类型,search1, search2, …是待匹配的值,result1, result2, …是匹配成功时返回的结果。如果没有匹配成功,可以使用可选参数default来设置默认返回结果,其使用方法与Oracle的decode函数类似。

七、Oracle数据库decode函数用法举例

以下是一个使用decode函数的综合示例,该示例用于查询emp表中每个员工的姓名、职位和基本工资,并按照职位和工资的大小返回不同的补贴。示例SQL如下:

SELECT ename, job, sal, 
    decode(job, 'CLERK', 
            decode(sign(sal-2000), -1, 0, 0.15*sal), 
        'SALESMAN',
            decode(sign(sal-3000), -1, 0.05*sal, 0.10*sal), 
        'MANAGER', 
            decode(sign(sal-4000), -1, 0.25*sal, 0.30*sal), 0) AS allowance 
FROM emp;

上述SQL语句中,第一个decode函数用于根据职位进行分类。对于‘CLERK’职位,再根据基本工资进行分类,并返回相应的补贴比例;对于‘SALESMAN’职位,也根据基本工资进行分类,并返回相应的补贴比例;对于‘MANAGER’职位,同样按照基本工资进行分类,并返回相应的补贴比例;默认值为0。结果如下:

ENAME       JOB        SAL     ALLOWANCE          
----------  --------- ------ -------------------
SMITH       CLERK       800                  0  
ALLEN       SALESMAN   1600                80  
WARD        SALESMAN   1250                62.5
JONES       MANAGER    2975            892.5  
MARTIN      SALESMAN   1250                62.5
BLAKE       MANAGER    2850            855   
CLARK       MANAGER    2450            735   
KING        PRESIDENT 10000            3000  
TURNER      SALESMAN   1500                75  
JAMES       CLERK       950                  0  
FORD        ANALYST    3000                  0  
MILLER      CLERK      1300                  0  

八、Hive中decode函数的用法

Hive中也提供了decode函数,其语法与Oracle类似,如下:

CASE expr WHEN search1 THEN result1 [WHEN search2 THEN result2 ...] [ELSE default] END

与Oracle不同的是

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/228742.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-10 12:09
下一篇 2024-12-10 12:09

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python中capitalize函数的使用

    在Python的字符串操作中,capitalize函数常常被用到,这个函数可以使字符串中的第一个单词首字母大写,其余字母小写。在本文中,我们将从以下几个方面对capitalize函…

    编程 2025-04-29
  • Python中set函数的作用

    Python中set函数是一个有用的数据类型,可以被用于许多编程场景中。在这篇文章中,我们将学习Python中set函数的多个方面,从而深入了解这个函数在Python中的用途。 一…

    编程 2025-04-29
  • 单片机打印函数

    单片机打印是指通过串口或并口将一些数据打印到终端设备上。在单片机应用中,打印非常重要。正确的打印数据可以让我们知道单片机运行的状态,方便我们进行调试;错误的打印数据可以帮助我们快速…

    编程 2025-04-29
  • 三角函数用英语怎么说

    三角函数,即三角比函数,是指在一个锐角三角形中某一角的对边、邻边之比。在数学中,三角函数包括正弦、余弦、正切等,它们在数学、物理、工程和计算机等领域都得到了广泛的应用。 一、正弦函…

    编程 2025-04-29
  • Python3定义函数参数类型

    Python是一门动态类型语言,不需要在定义变量时显示的指定变量类型,但是Python3中提供了函数参数类型的声明功能,在函数定义时明确定义参数类型。在函数的形参后面加上冒号(:)…

    编程 2025-04-29
  • Python实现计算阶乘的函数

    本文将介绍如何使用Python定义函数fact(n),计算n的阶乘。 一、什么是阶乘 阶乘指从1乘到指定数之间所有整数的乘积。如:5! = 5 * 4 * 3 * 2 * 1 = …

    编程 2025-04-29
  • Python定义函数判断奇偶数

    本文将从多个方面详细阐述Python定义函数判断奇偶数的方法,并提供完整的代码示例。 一、初步了解Python函数 在介绍Python如何定义函数判断奇偶数之前,我们先来了解一下P…

    编程 2025-04-29
  • 分段函数Python

    本文将从以下几个方面详细阐述Python中的分段函数,包括函数基本定义、调用示例、图像绘制、函数优化和应用实例。 一、函数基本定义 分段函数又称为条件函数,指一条直线段或曲线段,由…

    编程 2025-04-29
  • Python函数名称相同参数不同:多态

    Python是一门面向对象的编程语言,它强烈支持多态性 一、什么是多态多态是面向对象三大特性中的一种,它指的是:相同的函数名称可以有不同的实现方式。也就是说,不同的对象调用同名方法…

    编程 2025-04-29

发表回复

登录后才能评论