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

相关推荐
Είναι η κοπέλα2 小时前
模型量化完全指南:GGUF、GPTQ、AWQ 怎么选
人工智能·pytorch·python
yi0112 小时前
LeetCode 15:三数之和|排序 + 双指针,如何避免重复答案?
笔记·python·算法·leetcode·双指针
weixin199701080162 小时前
《1688消息服务落地方案:alibaba.message.* 与 Webhook 回调的可靠性与重试策略》(附Python源码)
开发语言·python
北风toto2 小时前
数据库笔记:Armstrong 公理系统与集合论的深度辨析
数据库·笔记
小蒜学长2 小时前
基于SpringBoot+Vue的租房管理系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·租房管理
一只专注api接口开发的技术猿2 小时前
Open‑Claw 实战|告别页面逆向,快速搭建电商商品监控与数据分析完整方案
大数据·数据库·python·数据挖掘·数据分析
雨落在了我的手上2 小时前
MySQL数据库基础(6):增删改查操作(1)
数据库·mysql
Omics Pro2 小时前
全新可重分析!代谢组质谱专用
数据库·人工智能·算法·机器学习·自然语言处理
Nebula_g2 小时前
JavaSE加强:线程Thread(线程安全重点)
java·开发语言·jvm·算法·javase·技术栈