DECODE 是 SQL 中的一个条件判断函数(主要存在于 Oracle 数据库中,部分其他数据库如 PostgreSQL 也支持类似的语法,但标准 SQL 中更常用 CASE)。
它的功能类似于 IF-THEN-ELSE 或 CASE 语句。
DECODE(expression, search1, result1,
search2, result2,
...,
default)
expression 的值
按顺序与 search1, search2, ... 比较
找到第一个匹配的 search 值,返回对应的 result
如果没有匹配且提供了 default,则返回 default
如果没有匹配且没有 default,则返回 NULL
-- 将部门编号转换为部门名称
SELECT employee_id,
DECODE(department_id,
10, '财务部',
20, '人事部',
30, '技术部',
'其他部门') AS department_name
FROM employees;
-- 将成绩等级转换为分数范围
SELECT student_name,
DECODE(grade,
'A', '90-100',
'B', '80-89',
'C', '70-79',
'D', '60-69',
'不及格') AS score_range
FROM student_grades;
-- 使用 DECODE
SELECT product_id,
DECODE(category_id,
1, '电子产品',
2, '服装',
3, '食品',
'其他') AS category_name
FROM products;
-- 等效的 CASE 语句
SELECT product_id,
CASE category_id
WHEN 1 THEN '电子产品'
WHEN 2 THEN '服装'
WHEN 3 THEN '食品'
ELSE '其他'
END AS category_name
FROM products;
-- 判断员工状态
SELECT employee_id,
DECODE(SIGN(salary - 5000),
1, '高薪',
0, '中等',
-1, '低薪') AS salary_level
FROM employees;
数据库兼容性:
性能:对于大量数据,DECODE 可能比 CASE 稍快,但差异通常不大
可读性:复杂的嵌套 DECODE 可能难以阅读和维护
-- 在所有数据库中通用的写法
SELECT employee_id,
CASE
WHEN department_id = 10 THEN '财务部'
WHEN department_id = 20 THEN '人事部'
WHEN department_id = 30 THEN '技术部'
ELSE '其他部门'
END AS department_name
FROM employees;
总之,如果你主要使用 Oracle 数据库且进行简单的值相等比较,DECODE 是一个简洁的选择。但如果需要跨数据库兼容性或更复杂的条件判断,建议使用标准的 CASE 语句。