好的,我给你详细讲解 Oracle 的 DECODE 函数,包括语法、使用场景、例子和注意事项。


1️⃣ 基本语法

DECODE(expression, search1, result1, search2, result2, ..., default)

参数说明:

参数说明
expression要判断的表达式(列名或值)
search1, search2…要匹配的值
result1, result2…对应匹配值返回的结果
default可选,若都不匹配返回默认值;如果不写,默认返回 NULL

2️⃣ 工作原理

DECODE 相当于 IF…ELSE 或 CASE WHEN 的简化形式:

  1. Oracle 会从左到右依次比较 expression 与 search 值。
  2. 如果匹配成功,返回对应的 result
  3. 如果都不匹配,则返回 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️⃣ 注意事项

  1. DECODE 对大小写敏感。
  2. 支持 NULL 判断:DECODE(expression, NULL, result),注意 NULL 比较方式。
  3. DECODE 是 Oracle 专用函数,其他数据库通常用 CASE WHEN 替代。
  4. 对复杂逻辑,CASE WHEN 可读性更高。

5️⃣ 对比 CASE WHEN

-- DECODE
DECODE(job, 'MANAGER', '经理', 'CLERK', '职员', '其他')

-- CASE WHEN
CASE job
    WHEN 'MANAGER' THEN '经理'
    WHEN 'CLERK' THEN '职员'
    ELSE '其他'
END

✅ 功能一样,但 CASE WHEN 更标准、可移植。