COALESCE在PostgreSQL中要求参数类型兼容,MySQL则宽松支持隐式转换;IFNULL仅MySQL可用;ISNULL是SQL Server替换函数,返回类型固定;空字符串等非NULL值需显式清洗。
COALESCE 是标准 SQL 函数,返回参数列表中第一个非 NULL 的值,但不同数据库对类型隐式转换的容忍度不同。PostgreSQL 要求所有参数类型兼容(或能被统一 cast),而 MySQL 更宽松——比如 COALESCE('abc', 123) 在 MySQL 中返回字符串 'abc',在 PostgreSQL 中会报错 ERROR: COALESCE types text and integer cannot be matched。
实操建议:
COALESCE(col::text, 'default')(PostgreSQL)或 COALESCE(CAST(col AS CHAR), 'default')(MySQL)'' 不等于 NULL,COALESCE(col, 'N/A') 对空字符串无效IFNULL 是 MySQL 专属函数,仅接受两个参数:IFNULL(expr1, expr2)。它在 SQLite、PostgreSQL 或 SQL Server 中直接报错 Unknown function IFNULL。有人误以为它是通用别名,结果在迁移或 ORM 动态拼 SQL 时踩坑。
实操建议:
COALESCE
IFNULL 对 NULL 和 0 的判断是严格区分的,不会把 0 当作“假值”处理(这点和 PHP 的 ?? 不同)IFNULL(IFNULL(a, b), c) 不如 COALESCE(a, b, c) 直观且可变长SQL Server 的 ISNULL 不是布尔判断函数,而是替换函数,签名是 ISNULL(check_expression, replacement_value)。但它和 COALESCE 关键区别在于:返回类型始终和 check_expression 一致,不按参数中最高精度推导。例如 ISNULL(CAST(1 AS TINYINT), 1000) 会截断为 255(溢出),而 COALESCE(CAST(1 AS TINYINT), 1000) 返回 1000(类型升为 INT)。
实操建议:
DECIMAL(5,2),用 ISNULL(col, 0.00) 安全;但用 ISNULL(col, 999.999) 会四舍五入或报错,取决于版本ISNULL 替代 EXISTS 或 WHERE col IS NULL,它的语义是“替换”,不是“判断”ISNULL 比 COALESCE 更可能被优化器内联,性能略优,但可读性代价高数据库里 NULL 是缺失值,但业务中常混入空字符串 ''、全空格字符串、0(如金额)、甚至 JSON 字段里的 null 值(字符串 "null")。这些都不会被 COALESCE / IFNULL / ISNULL 捕获。
实操建议:
NULLIF(TRIM(col), '') 把空白转为 NULL,再套 COALESCE
JSON
_VALUE(col, '$.field') 返回 NULL 表示路径不存在或值为 JSON null;MySQL 8.0+ 的 JSON_EXTRACT 同理,但需配合 ->> 操作符才能自动展开为标量"" 表示“清空”,而应传 NULL,否则 SQL 层永远要多一层 CASE WHEN col = '' THEN NULL ELSE col END