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无代码市场,只需一个提示快速构建应用程序
相关推荐
山哥ol16 分钟前
【Geany 环境配置与中文乱码解决参考】forestsea26 分钟前
从零构建 Java 智能体 RAG 系统:Milvus 向量数据库实战指南用户0942485680329 分钟前
第10章:OpenJDK异常体系、栈轨迹与错误诊断入门会飞锦鲤41 分钟前
基于 Mask R-CNN 的药片缺陷检测系统默 语44 分钟前
Java新手入门:从零开始安装JDK并配置环境变量probex_1 小时前
从 ByConity 到 VictoriaMetrics:一次指标数据迁移引发的四种存储对比清水白石0081 小时前
Python 异步编程深度解析:Cancellation 到底是异常还是控制信号?从 asyncio 取消机制到企业级事务设计最佳实践Patrick在香港2 小时前
Python 审计香港开放数据目录:两个端点差 10 倍,只有 9.3% 的资源标了「最后修改时间」IT毕设梦工厂2 小时前
计算机毕业设计选题推荐:基于大数据的草鱼价格分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目这个DBA有点耶2 小时前
自增主键用尽了怎么办?INT溢出、在线迁移与预防策略全解析