在Oracle PL/SQL开发里,decode()函数用来在SQL语句中做条件分支判断,它可以把复杂的if-else逻辑压缩成一行函数调用,常用于报表查询和字段转换。理解它的参数顺序和匹配规则,能让你少写很多case when代码。

decode()函数的基本语法
decode()函数的标准写法如下,它至少要有三个参数,后面可以成对追加条件和结果:
DECODE(express, search_1, result_1,
search_2, result_2,
...
default_result)
函数会依次比较express和search_n的值,如果相等就返回对应的result_n;如果全部不匹配,返回最后的default_result。如果没有写默认值且都不匹配,结果就是空值。
最常见的字段转换用法
比如员工表里性别字段存的是M和F,想在查询结果里显示中文:
SELECT emp_name,
DECODE(gender, 'M', '男', 'F', '女', '未知') AS gender_cn
FROM emp;
在PL/SQL块中的使用
decode()也能写在PL/SQL的SQL语句里,下面这个例子根据分数给等级:
DECLARE
v_score NUMBER := 85;
v_level VARCHAR2(10);
BEGIN
SELECT DECODE(TRUNC(v_score/10),
10, '优',
9, '优',
8, '良',
7, '中',
'差')
INTO v_level
FROM dual;
DBMS_OUTPUT.PUT_LINE('等级是:' || v_level);
END;
实现简单区间统计
利用decode()配合聚合函数,可以轻松做分组计数:
SELECT COUNT(*) AS total, SUM(DECODE(DEPT_ID, 10, 1, 0)) AS dept_10_cnt, SUM(DECODE(DEPT_ID, 20, 1, 0)) AS dept_20_cnt FROM emp;
decode与case的对比
虽然decode()写法简短,但它只能做相等比较。如果遇到大于小于这种区间判断,还是要用case表达式。日常开发中,简单等值转换用decode()更直观,复杂逻辑建议用case when,可读性更好。
| 对比项 | decode() | case |
|---|---|---|
| 比较方式 | 仅等值 | 等值或范围 |
| 语法长度 | 短 | 稍长 |
| 跨数据库 | 仅Oracle | 标准SQL |
使用注意点
- decode()里所有参数类型要尽量一致,否则Oracle会做隐式转换。
- 默认值放在最后,不写则可能返回空。
- 嵌套decode()会降低可读性,超过三层建议改case。
小结:decode()是Oracle自带的条件函数,适合做等值映射和简单统计,掌握它能让SQL更简洁。