一、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不同的是