如何处理SQL中的NULL值_使用ISNULL或COALESCE函数

ISNULL返回首参数类型,COALESCE按优先级隐式转换;WHERE中NULL需用IS NULL判断;聚合函数自动忽略NULL;JOIN时NULL导致不匹配;NULL是缺失标记而非值。ISNULL 和 COALESCE 看起来都能填 NULL,但行为完全不同SQL Server 的 ISNULL 是 T-SQL 特有函数,只接受两个参数,返回第一个非 NULL 的值;COALESCE 是标准 SQL 函数,支持任意多个参数,按顺序返回第一个非 NULL 表达式。关键区别在于数据类型推导:ISNULL 返回第一个参数的类型,而 COALESCE 按数据类型优先级隐式转换(比如 COALESCE(NULL, 'abc', 123) 会把 'abc' 转成 int 报错)。常见错误现象:ISNULL(@val, '') 在 @val 是 INT 时返回空字符串,但类型变成 VARCHAR,可能意外影响后续计算或索引使用;COALESCE(@val, 0) 如果 @val 是 DECIMAL(10,2),结果类型是 DECIMAL(10,2),更安全。用 ISNULL 仅当明确要保留左侧字段原始类型,且只补一个默认值用 COALESCE 更通用、可读性更好,尤其在跨数据库迁移时(PostgreSQL/MySQL 都支持)避免混用不同类型:比如 COALESCE(date_col, GETDATE(), '1900-01-01') 中字符串字面量会强制转为 DATETIME,但格式不匹配就报错WHERE 条件里写 col = NULL 永远不成立这是最常踩的坑:SQL 中 NULL 不参与任何等值比较,col = NULL 结果恒为 UNKNOWN,被 WHERE 当作 false 过滤掉。必须用 IS NULL 或 IS NOT NULL 显式判断。使用场景:筛选缺失数据、排除脏数据、做空值统计。例如想查"没填邮箱的用户",不能写 WHERE email = NULL,得写 WHERE email IS NULL。WHERE col IN (1, 2, NULL) 等价于 WHERE col = 1 OR col = 2 OR col = NULL ------ 最后一部分永远不生效,实际只查了 1 和 2想同时匹配非空值和 NULL,得拆开:WHERE col IN (1, 2) OR col IS NULL如果字段加了索引,col IS NULL 在大多数引擎(SQL Server、PostgreSQL)中能走索引;但 ISNULL(col, 0) = 0 一定无法利用索引聚合函数(SUM、AVG、COUNT)对 NULL 的默认处理逻辑SUM、AVG、MAX、MIN 自动忽略 NULL 值;COUNT(*) 统计所有行,COUNT(col) 只统计该列非 NULL 的行数。这点容易误判业务指标------比如用 COUNT(email) 算"有邮箱用户数",是对的;但用 COUNT(*) 就包含没填邮箱的用户。 Felvin AI无代码市场,只需一个提示快速构建应用程序

相关推荐
笃行35037 分钟前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行35041 分钟前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3501 小时前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
金銀銅鐵2 小时前
n^5 和 n 的个位数是否总相等?
python·数学
aqi005 小时前
15天学会AI应用开发(九)利用Chroma持久化向量数据
人工智能·python·大模型·ai编程·ai应用
金銀銅鐵5 小时前
借助 Pygame 探索最大公约数的规律
python·数学·游戏
ServBay1 天前
9 个 Python 第三方库推荐,不用 AI 都好像多出一个团队
后端·python
用户8356290780511 天前
如何使用 Python 添加和管理 Excel 批注(完整示例)
后端·python