网站首页 > 技术文章 正文
什么是 COALESCE 函数?
核心作用:返回参数列表中第一个非 NULL 的值,支持所有主流数据库(MySQL、Oracle、SQL Server 等)。
为什么需要用它?
在数据库中,NULL 值不是空字符串也不是 0,却会导致:
- 查询结果显示异常(比如联系方式为空)
- 计算出错(比如金额 + NULL 会得到 NULL)
- 代码冗长(用多层 CASE WHEN 判断)
实战案例:3 种场景秒懂用法
场景 1:优化用户联系方式展示
需求:优先显示手机号,手机号为空时显示邮箱,两者都空则显示 “未填写”。
传统写法(繁琐):
SELECT
username,
CASE
WHEN phone IS NOT NULL THEN phone
WHEN email IS NOT NULL THEN email
ELSE '未填写'
END AS contact_info
FROM user_profile;
COALESCE 写法(简洁):
SELECT
username,
COALESCE(phone, email, '未填写') AS contact_info
FROM user_profile;
场景 2:处理异常日期计算
需求:计算用户注册天数,注册时间异常(为 NULL)时显示 0。
传统写法(多判断):
SELECT
username,
CASE
WHEN register_time IS NOT NULL THEN DATEDIFF(CURDATE(), register_time)
ELSE 0
END AS register_days
FROM user_profile;
COALESCE 写法(一步到位):
SELECT
username,
COALESCE(DATEDIFF(CURDATE(), register_time), 0) AS register_days
FROM user_profile;
场景 3:避免计算结果为 NULL
需求:计算订单总金额(含优惠,优惠可能为 NULL)。
直接计算(会出问题):
-- 当discount为NULL时,结果会变成NULL
SELECT order_id, amount + discount AS total_amount FROM orders;
COALESCE 处理(安全计算):
-- 优惠为NULL时自动按0计算
SELECT
order_id,
amount + COALESCE(discount, 0) AS total_amount
FROM orders;
4 大核心优势
- 简化代码:一行替代多层 CASE WHEN,减少 50%+ 代码量
- 防错兜底:自动处理 NULL 值,避免计算 / 展示异常
- 通用兼容:所有数据库都支持,不用改语法
- 一眼看懂:函数名和逻辑对应,新手也能快速理解
你遇到过因 NULL 值导致的奇葩问题吗?比如报表突然出现空白、计算结果莫名错误?除了 COALESCE,你还有哪些压箱底的处理技巧?评论区分享一下!
猜你喜欢
- 2025-07-27 基于X86平台的高性能数据库集群技术的研究
- 2025-07-27 还不理解 Error 和 Exception 吗,看这篇就够了
- 2025-07-27 案例分享| CPU监控异常(cpu实时监控)
- 2025-07-27 PL/SQL基础之异常(运行sql出现异常)
- 2024-10-28 Ask Oracle:狮子座6月5日至11日运势详细分析
- 2024-10-28 oracle的控制文件的隐含参数 oracle查看控制文件路径
- 2024-10-28 Oracle数据库常用undo查询思路 oracle undo
- 2024-10-28 Oracle序列中Cache与NoCache的区别及何时使用
- 2024-10-28 重建MDisk导致上层Oracle数据库不可用的服务器数据恢复案例
- 2024-10-28 Oracle 11g 数据库的日常巡检内容和方法
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)