Oracle CASE与DECODE 函数的用法

举报
江晚正愁余 发表于 2024/01/16 12:53:35 2024/01/16
【摘要】 CASE与DECODE 函数的用法 SELECT e.EMPLOYEE_ID, e.FIRST_NAME, DECODE (e.DEPARTMENT_ID, 10, 'Admin', 20, 'Marketing', 60, 'IT', 80, 'Sales', 100, 'Finance', '...

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;
​
​



2.6.9.9 在查询中使用 CASE 表达式

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

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

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

另请参阅:

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

CopySELECT 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;

结果:

CopyID 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 表达式

CopySELECT 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;

结果:

CopyName                      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.



2.6.9.10 在查询中使用解码函数

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 函数

CopySELECT 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;

结果:

CopyLAST_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.




 

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。