DECODE() 是 Oracle 的一个非常强大且常用的条件表达式函数,它实现了类似于 if-then-else 或 case-when 的逻辑,但语法更为简洁
语法格式
sql
DECODE(expression, search1, result1,
[search2, result2, ...],
[default])
参数说明
expression:要比较的值或表达式
search1, search2,...:要与 expression 比较的值
result1, result2,...:当 expression 与对应的 search 值匹配时返回的结果
default:可选参数,当没有匹配项时返回的默认值,如果省略且没有匹配项,则返回 NULL
DECODE()函数将 expression 依次与每个 search 值进行比较:
① 如果 expression 等于 search1,则返回 result1
② 如果不等于,则继续比较 search2,如果匹配则返回 result2
③ 依此类推,直到找到匹配项
④ 如果没有匹配项且提供了 default 参数,则返回 default 值
⑤ 如果没有匹配项且未提供 default 参数,则返回 NULL
示例
sql
-- 简单的值比较
SELECT DECODE(1, 1, 'One', 2, 'Two', 'Other') FROM dual; -- 'One'
SELECT DECODE(3, 1, 'One', 2, 'Two', 'Other') FROM dual; -- 'Other'
SELECT DECODE(1+2, 3, 'A', 'B') from dual; -- 'A'
SELECT DECODE(1+2, 4, 'A', 'B') from dual; -- 'B'
-- 转换描述
SELECT order_id,
DECODE(status,
'P', 'Pending',
'S', 'Shipped',
'D', 'Delivered',
'Unknown Status') AS status_desc
FROM orders;
-- 数值范围判断
SELECT employee_name,
salary,
DECODE(SIGN(salary - 5000),
-1, 'Low',
0, 'Medium',
1, 'High') AS salary_level
FROM employees;
-- 多条件组合
SELECT product_id,
DECODE(category, 'A', price*0.9,
'B', price*0.8,
'C', price*0.7,
price) AS discounted_price
FROM products;
-- 与聚合函数结合使用
SELECT department_id,
COUNT(*) AS total,
COUNT(DECODE(gender, 'M', 1, NULL)) AS male_count,
COUNT(DECODE(gender, 'F', 1, NULL)) AS female_count
FROM employees
GROUP BY department_id;
-- 嵌套DECODE()函数
SELECT employee_name,
DECODE(DECODE(department, 'IT', 1, 'HR', 2, 0),
1, 'Technical',
2, 'Administrative',
'Other') AS employee_type
FROM employees;
提示Tips
① DECODE()函数对NULL值的处理:DECODE()认为 NULL 等于 NULL
sql
SELECT DECODE(NULL, NULL, 'Equal', 'Not Equal') FROM dual; -- 'Equal'
② 对于简单的条件判断,DECODE()通常比 CASE 表达式更高效,但对于复杂的多条件逻辑,CASE 表达式可能更清晰易读
③ DECODE()函数会尝试将所有参数转换为第一个 result 参数的数据类型
所有 result 值应最好保持相同或兼容的数据类型