如何处理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无代码市场,只需一个提示快速构建应用程序

相关推荐
天才测试猿5 小时前
2026软件测试面试八股文(含答案+文档)
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
long3166 小时前
MySQL 学习练习(配套 01 入门资料)
数据库·学习·mysql
张小凡vip6 小时前
python--爬虫--成熟的爬虫框架Scrapy
爬虫·python·scrapy
Pluchon6 小时前
Java个人综合项目——萌部落社区V2.0
java·python·spring·spring cloud·postman·idea
梦云莓铃 脚后跟法7 小时前
从一个真实案例理解 JVM 标量替换
jvm
数据库小学妹7 小时前
数据库等保三级和四级有什么区别?从访问控制到备份恢复的完整对比
数据库·安全·数据库安全·三级等保·等保合规·四级等保
不瘦80斤不改名7 小时前
01-vibe-coding-起源与本质
人工智能·python
夜雪一千7 小时前
如何对新闻数据进行模糊去重
python
看浪的路人8 小时前
第3讲:手写第一个 MCP Server(Python SDK)
jvm·数据库·oracle
大眼、不聚光9 小时前
5.mysql--主从同步安装部署
数据库·mysql