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无代码市场,只需一个提示快速构建应用程序
相关推荐
KaMeidebaby9 小时前
卡梅德生物技术快报|骆驼纳米抗体:从原核表达、高通量测序到分子对接全流程实现阿正的梦工坊9 小时前
深入理解 PyTorch 中的 unsqueeze 操作FreakStudio9 小时前
硬件版【Cursor】?aily blockly IDE尝鲜封神,实战硬伤尽显测试员周周11 小时前
【Appium 系列】第06节-页面对象实现 — LoginPage 实战2301_7838486511 小时前
优化文本分类中堆叠模型的网格搜索性能:避免训练卡顿的实战指南TE-茶叶蛋12 小时前
DBeaver 的Explain 执行计划,分析sql的性能CLX050512 小时前
如何安装Oracle 12c Cloud Control_OMS服务端组件与Agent部署m0_6174939413 小时前
PySide6 网络请求深度实测:从基础 API 调用到数据解析实战指南知识汲取者13 小时前
每日一篇高频面试题系列之【MySQL 锁】老纪13 小时前
SQL中如何查找特定的空值行:WHERE IS NULL深度解析