SQL decode() 函数
1. 基本语法
DECODE(表达式, 值1, 结果1, 值2, 结果2, ..., 默认值)
- 工作原理: 比较第一个参数(表达式)与后续的 "值 N":
- 如果表达式等于
值1
,返回结果1
- 如果表达式等于
值2
,返回结果2
- ... 以此类推
- 如果都不匹配,返回最后的
默认值
(如果省略默认值,则返回NULL
)
- 如果表达式等于
假设有一张 student
表,包含 id
、name
、score
字段,现在需要根据分数判断等级:
id | name | score |
---|---|---|
1 | 张三 | 85 |
2 | 李四 | 62 |
3 | 王五 | 93 |
4 | 赵六 | 58 |
SQL 示例:
SELECT name,score,DECODE(FLOOR(score/10), -- 表达式:分数除以10取整10, 'A+', -- 100分 → A+9, 'A', -- 90-99分 → A8, 'B', -- 80-89分 → B7, 'C', -- 70-79分 → C6, 'D', -- 60-69分 → D'不及格' -- 其他分数 → 不及格(默认值)) AS grade
FROM student;
结果:
name | score | grade
------|-------|-------
张三 | 85 | B
李四 | 62 | D
王五 | 93 | A
赵六 | 58 | 不及格
2. 配合聚合函数使用
SELECT DECODE(gender, -- 按性别分组'男', '男生', '女', '女生', '未知') AS 性别分组,COUNT(*) AS 人数,AVG(score) AS 平均分数
FROM student
GROUP BY DECODE(gender, '男', '男生', '女', '女生', '未知');
3. DECODE()
注意事项
DECODE()
和 CASE WHEN
都能实现条件判断,但有以下区别:
特性 | DECODE() | CASE WHEN |
---|---|---|
语法简洁性 | 更简洁,适合简单判断 | 更灵活,适合复杂逻辑 |
支持的数据类型 | 主要支持等值判断 | 支持各种比较(>、<、IN 等) |
数据库兼容性 | 主要支持 Oracle,其他库有限 | 几乎所有数据库都支持 |
例如,CASE WHEN
可以实现范围判断,而 DECODE()
不能:
-- CASE WHEN 支持范围判断
CASE WHEN score >= 90 THEN '优秀'WHEN score >= 60 THEN '及格'ELSE '不及格'
END
注意事项
数据库支持:
DECODE()
是 Oracle 的专有函数,MySQL、SQL Server 等数据库不支持,这些数据库建议使用CASE WHEN
。等值判断限制:
DECODE()
只能做等值比较,无法直接实现大于、小于等范围判断。默认值:如果省略默认值,当所有条件不匹配时返回
NULL
。
如果需要编写跨数据库兼容的代码,优先使用 CASE WHEN
;如果是 Oracle 环境且逻辑简单,DECODE()
可以让代码更简洁。