Oracle 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 表达式,简单表达式和搜索表达式。
中的查询使用简单的 CASE 表达式来显示每个国家/地区代码的国家/地区名称。
中的查询使用搜索的 CASE 表达式根据与服务年限关联的日期范围显示建议的加薪(15%、10%、5% 或 0%)。
另请参阅:
-
有关 CASE 表达式的更多信息,Oracle
-
,了解有关 CASE 表达式的更多信息
-
""
-
""
示例 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(如果未指定默认值)。
中的查询使用 DECODE 函数显示三个不同工作的建议加薪。表达式为JOB_ID;搜索值为“PU_CLERK”、“SH_CLERK”和“ST_CLERK”;默认值为薪水。
注意:
DECODE 函数的参数可以是任何 SQL 数字或字符类型。Oracle 会在比较之前自动将表达式和每个搜索值转换为第一个搜索值的数据类型。Oracle 会自动将返回值转换为与第一个结果相同的数据类型。如果第一个结果的数据类型为 CHAR,或者第一个结果为 NULL,则 Oracle 会将返回值转换为数据类型 VARCHAR2。
另请参阅:
-
有关解码功能的信息,Oracle
-
""
示例 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.
- 点赞
- 收藏
- 关注作者
评论(0)