好的,我给你详细讲解 Oracle 的 DECODE
函数,包括语法、使用场景、例子和注意事项。
1️⃣ 基本语法
DECODE(expression, search1, result1, search2, result2, ..., default)
参数说明:
参数 | 说明 |
---|---|
expression | 要判断的表达式(列名或值) |
search1, search2… | 要匹配的值 |
result1, result2… | 对应匹配值返回的结果 |
default | 可选,若都不匹配返回默认值;如果不写,默认返回 NULL |
2️⃣ 工作原理
DECODE
相当于 IF…ELSE 或 CASE WHEN 的简化形式:
- Oracle 会从左到右依次比较
expression
与search
值。 - 如果匹配成功,返回对应的
result
。 - 如果都不匹配,则返回
default
(或者 NULL)。
3️⃣ 示例
示例 1:基本用法
SELECT empno,
ename,
DECODE(job,
'MANAGER', '经理',
'CLERK', '职员',
'SALESMAN', '销售',
'其他') AS job_cn
FROM emp;
解释:
- 如果
job = 'MANAGER'
→ 返回'经理'
- 如果
job = 'CLERK'
→ 返回'职员'
- 如果
job = 'SALESMAN'
→ 返回'销售'
- 其他情况 → 返回
'其他'
示例 2:处理数字
SELECT empno, sal,
DECODE(sal,
1000, '低薪',
2000, '中薪',
3000, '高薪',
'未分类') AS salary_level
FROM emp;
解释:
sal=1000
→'低薪'
sal=2000
→'中薪'
sal=3000
→'高薪'
- 其他 →
'未分类'
示例 3:嵌套 DECODE
SELECT empno, ename,
DECODE(deptno,
10, DECODE(job, 'MANAGER', '研发经理', '员工'),
20, '销售部',
'其他') AS dept_job
FROM emp;
deptno=10
且job='MANAGER'
→'研发经理'
deptno=10
其他 →'员工'
deptno=20
→'销售部'
- 其他 →
'其他'
4️⃣ 注意事项
DECODE
对大小写敏感。- 支持 NULL 判断:
DECODE(expression, NULL, result)
,注意 NULL 比较方式。 DECODE
是 Oracle 专用函数,其他数据库通常用 CASE WHEN 替代。- 对复杂逻辑,CASE WHEN 可读性更高。
5️⃣ 对比 CASE WHEN
-- DECODE
DECODE(job, 'MANAGER', '经理', 'CLERK', '职员', '其他')
-- CASE WHEN
CASE job
WHEN 'MANAGER' THEN '经理'
WHEN 'CLERK' THEN '职员'
ELSE '其他'
END
✅ 功能一样,但 CASE WHEN 更标准、可移植。
发表回复