记录日常工作关于系统运维,虚拟化云计算,数据库,网络安全等各方面问题。
 
0

CASE与DECODE 函数的用法

发表者:admin分类:数据库2022-12-09 15:24:50 阅读[278]

CASE与DECODE 函数的用法

 

SELECT e.EMPLOYEE_ID,
       e.FIRST_NAME,
       DECODE (e.DEPARTMENT_ID,
               10, 'Admin',
               20, 'Marketing',
               60, 'IT',
               80, 'Sales',
               100, 'Finance',
               '其它部门')
           AS 部门,
       CASE WHEN e.SALARY > 6000 THEN '高工资' ELSE '低工资' END
           AS 工资等级,
       CASE
           WHEN (SELECT COUNT (e2.EMPLOYEE_ID)
                   FROM EMPLOYEES e2
                  WHERE e2.DEPARTMENT_ID = e.DEPARTMENT_ID) > 10
           THEN
               '部门人员多'
           ELSE
               '人员少部门'
       END
           AS 部门人员级别
  FROM EMPLOYEES e;



在查询中使用 CASE 表达式

CASE 表达式允许您使用 IF ...然后...SQL 语句中的 ELSE 逻辑,而不调用子程序。有两种类型的 CASE 表达式,简单表达式和搜索表达式。

示例 2-27 中的查询使用简单的 CASE 表达式来显示每个国家/地区代码的国家/地区名称。

示例 2-28 中的查询使用搜索的 CASE 表达式根据与服务年限关联的日期范围显示建议的加薪(15%、10%、5% 或 0%)。

另请参阅:

示例 2-27 在查询中使用简单的 CASE 表达式

SELECT UNIQUE COUNTRY_ID ID, CASE COUNTRY_ID WHEN 'AU' THEN 'Australia' WHEN 'BR' THEN 'Brazil' WHEN 'CA' THEN 'Canada' WHEN 'CH' THEN 'Switzerland' WHEN 'CN' THEN 'China' WHEN 'DE' THEN 'Germany' WHEN 'IN' THEN 'India' WHEN 'IT' THEN 'Italy' WHEN 'JP' THEN 'Japan' WHEN 'MX' THEN 'Mexico' WHEN 'NL' THEN 'Netherlands' WHEN 'SG' THEN 'Singapore' WHEN 'UK' THEN 'United Kingdom' WHEN 'US' THEN 'United States' ELSE 'Unknown' END COUNTRY FROM LOCATIONS ORDER BY COUNTRY_ID;

结果:

ID COUNTRY -- -------------- AU Australia BR Brazil CA Canada CH Switzerland CN China DE Germany IN India IT Italy JP Japan MX Mexico NL Netherlands SG Singapore UK United Kingdom US United States 14 rows selected.

示例 2-28 在查询中使用搜索的 CASE 表达式

SELECT LAST_NAME "Name", HIRE_DATE "Started", SALARY "Salary", CASE WHEN HIRE_DATE < TO_DATE('01-Jan-03', 'dd-mon-yy') THEN TRUNC(SALARY*1.15, 0) WHEN HIRE_DATE >= TO_DATE('01-Jan-03', 'dd-mon-yy') AND HIRE_DATE < TO_DATE('01-Jan-06', 'dd-mon-yy') THEN TRUNC(SALARY*1.10, 0) WHEN HIRE_DATE >= TO_DATE('01-Jan-06', 'dd-mon-yy') AND HIRE_DATE < TO_DATE('01-Jan-07', 'dd-mon-yy') THEN TRUNC(SALARY*1.05, 0) ELSE SALARY END "Proposed Salary" FROM EMPLOYEES WHERE DEPARTMENT_ID = 100 ORDER BY HIRE_DATE;

结果:

Name Started Salary Proposed Salary ------------------------- --------- ---------- --------------- Faviet 16-AUG-02 9000 10350 Greenberg 17-AUG-02 12008 13809 Chen 28-SEP-05 8200 9020 Sciarra 30-SEP-05 7700 8470 Urman 07-MAR-06 7800 8190 Popp 07-DEC-07 6900 6900 6 rows selected.
在查询中使用解码函数

DECODE 函数将表达式与多个搜索值进行比较。只要表达式的值与搜索值匹配,DECODE 就会返回与该搜索值关联的结果。如果 DECODE 找不到匹配项,则返回默认值(如果指定)或 NULL(如果未指定默认值)。

示例 2-29 中的查询使用 DECODE 函数显示三个不同工作的建议加薪。表达式为JOB_ID;搜索值为“PU_CLERK”、“SH_CLERK”和“ST_CLERK”;默认值为薪水。

注意:

DECODE 函数的参数可以是任何 SQL 数字或字符类型。Oracle 会在比较之前自动将表达式和每个搜索值转换为第一个搜索值的数据类型。Oracle 会自动将返回值转换为与第一个结果相同的数据类型。如果第一个结果的数据类型为 CHAR,或者第一个结果为 NULL,则 Oracle 会将返回值转换为数据类型 VARCHAR2

另请参阅:

示例 2-29 在查询中使用 DECODE 函数

SELECT LAST_NAME, JOB_ID, SALARY, DECODE(JOB_ID, 'PU_CLERK', SALARY * 1.10, 'SH_CLERK', SALARY * 1.15, 'ST_CLERK', SALARY * 1.20, SALARY) "Proposed Salary" FROM EMPLOYEES WHERE JOB_ID LIKE '%_CLERK' AND LAST_NAME < 'E' ORDER BY LAST_NAME;

结果:

LAST_NAME JOB_ID SALARY Proposed Salary ------------------------- ---------- ---------- --------------- Atkinson ST_CLERK 2800 3360 Baida PU_CLERK 2900 3190 Bell SH_CLERK 4000 4600 Bissot ST_CLERK 3300 3960 Bull SH_CLERK 4100 4715 Cabrio SH_CLERK 3000 3450 Chung SH_CLERK 3800 4370 Colmenares PU_CLERK 2500 2750 Davies ST_CLERK 3100 3720 Dellinger SH_CLERK 3400 3910 Dilly SH_CLERK 3600 4140 11 rows selected.






 




转载请标明出处【CASE与DECODE 函数的用法】。

《www.micoder.cc》 虚拟化云计算,系统运维,安全技术服务.

网站已经关闭评论