在 SQL Server 开发中,处理 NULL 值是日常高频场景。很多人习惯用普通方式判断,却容易漏掉数据或报错。今天聊聊几种主流的空值处理方式及一些实用的查询优化技巧。
ISNULL 函数的使用限制
ISNULL 是 SQL Server 特有的函数,它只接受两个参数:检查表达式和替换值。
ISNULL(check_expression, replacement_value)
常见误区是试图传入三个参数,例如 ISNULL(col, 'Y', 'N'),这在语法上是错误的。如果需要根据条件返回不同值,得换别的写法。
CASE WHEN 的灵活性
如果需要类似三目运算符的效果(比如字段为 NULL 返回 'Y',否则返回 'N'),CASE WHEN 是最稳妥的选择。
CASE WHEN ItemCode IS NULL THEN 'Y' ELSE 'N' END
虽然写法稍长,但逻辑清晰,且兼容所有版本的 SQL Server。
IIF 函数的简洁性
如果你使用的是 SQL Server 2012 及以上版本,IIF 函数能让代码更短。
IIF(ItemCode IS NULL, 'Y', 'N')
它的逻辑和 CASE WHEN 类似,但只支持简单的布尔判断,不支持复杂嵌套。
两个实用的查询小技巧
除了空值处理,下面这两个技巧在实际开发中也能显著提升代码质量。
1. 安全拼接字符串
传统使用加号 + 拼接时,只要有一个字段是 NULL,结果就会变成 NULL。
-- 旧方法有风险
SELECT FirstName + ' ' + LastName AS FullName FROM Employees;
-- 推荐:CONCAT 自动忽略 NULL
SELECT CONCAT(FirstName, ' ', LastName) AS FullName FROM Employees;
CONCAT 函数会将 NULL 视为空字符串,确保拼接结果不为 NULL,代码也更易读。
2. EXISTS 替代 IN
在检查记录是否存在时,IN 子查询可能会先加载整个结果集,影响性能。
Customers
CustomerID ( CustomerID Orders OrderDate );
Customers c
( Orders o
o.CustomerID c.CustomerID o.OrderDate );


