[Oracle] DECODE()函数

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 值应最好保持相同或兼容的数据类型

相关推荐
摇滚侠5 分钟前
在 Oracle SQL 中实现 `IF-ELSE` 逻辑 SQL 错误 [12704] [72000]: ORA-12704: 字符集不匹配
数据库·sql·oracle
lypzcgf4 小时前
Coze源码分析-资源库-删除数据库-后端源码-流程/核心技术/总结
数据库·go·coze·coze源码分析·智能体平台·ai应用平台·agent平台
l1t6 小时前
拉取postgresql 18.0 docker镜像并运行容器
数据库·docker·postgresql
wszysystem6 小时前
UniDac控件关于主从表的创建
数据库
Morpheon6 小时前
SQL窗口函数中的排名函数详解:从基础到高级应用
数据库·sql·mysql
boonya7 小时前
Postgresql 如何开启矢量数据库扩展
数据库
熊文豪7 小时前
时序数据库选型指南:如何为企业选择合适的时序数据库解决方案
数据库·时序数据库·iotdb
码农学院7 小时前
MSSQL字段去掉excel复制过来的换行符
前端·数据库·sqlserver
jun~7 小时前
SQLMap数据库枚举靶机(打靶记录)
linux·数据库·笔记·学习·安全·web安全
计算机毕业设计小帅7 小时前
【2026计算机毕业设计】基于Springboot的娱乐网站设计与实现
数据库·课程设计