ISNULL 用法
在 SQL Server 中,ISNULL 函数只接受两个参数,不支持三个参数的情况。
错误写法示例:
ISNULL(t11.ItemCode,'Y','N')
ISNULL 函数的正确语法是:
ISNULL(check_expression, replacement_value)
CASE WHEN 用法
如果需要实现类似三目运算符的功能(当字段为 NULL 时返回 'Y',否则返回 'N'),可以使用 CASE WHEN 表达式:
CASE WHEN t11.ItemCode IS NULL THEN 'Y' ELSE 'N' END
IIF
或者使用更简洁的 IIF 函数(SQL Server 2012 及以上版本支持):
IIF(t11.ItemCode IS NULL, 'Y', 'N')
查询小技巧
技巧一:使用 CONCAT 安全地拼接字符串
问题: 传统的用加号 + 拼接字符串时,如果任何一个字段为 NULL,整个结果都会变成 NULL。
旧方法(有风险):
SELECT FirstName + ' ' + LastName AS FullName FROM Employees;
小技巧(使用 CONCAT):
SELECT CONCAT(FirstName, ' ', LastName) AS FullName FROM Employees;
好处:
CONCAT函数会自动将NULL值视为空字符串''来处理。- 即使
FirstName或LastName为 NULL,其他部分依然会正常拼接,最终结果不会是 NULL。 - 代码更简洁易读。
技巧二:使用 EXISTS 代替 IN 来检查存在性
问题: 当使用 IN 子查询时,数据库需要先执行整个子查询,返回所有结果集,然后再进行主查询和子查询结果的匹配,如果子查询结果集很大,性能会较差。
旧方法(可能低效):
SELECT * FROM Customers WHERE CustomerID IN (SELECT DISTINCT CustomerID FROM Orders WHERE OrderDate > '2023-01-01');
小技巧(使用 EXISTS):
SELECT * FROM Customers c WHERE EXISTS (SELECT 1 FROM Orders o WHERE o.CustomerID = c.CustomerID AND o.OrderDate > '2023-01-01');
好处:
- 性能更高:
EXISTS是一种关联子查询,一旦找到一条满足条件的记录就会立即返回True并停止搜索,避免了处理整个子查询结果集。 - 语义更清晰:
EXISTS直接表达了'是否存在'的逻辑意图。 - 在子查询结果集很大时,性能提升尤为明显。


