平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“Sql Server数据库中isnull、iif、case when三种……”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
从实现思路看,有时候数据库你接触多了,就会知道一些技巧,说实在有时候博主没有接触到,我可能还是会用普通方式去判断,这样就会存在漏数据的情况。
所以,平时去积累一些技巧还是很有必要的。
在这个场景下,在 SQL Server 里,ISNULL 函数只接受两个参数,不兼容三个参数的情况。
博主刚开始是这么用的 ISNULL(t11.ItemCode,'Y','N'),这种写法是错误的。
ISNULL 函数的正确语法是:
ISNULL(check_expression, replacement_value)
实际处理时,若需实现类似三个参数的功能(当字段为 NULL 时得到 ‘Y’,否则得到 ‘N’),能够采用 CASE WHEN 表达式:
CASE WHEN t11.ItemCode IS NULL THEN 'Y' ELSE 'N' END
或者采用更简洁的 IIF 函数(SQL Server 2012 及以上版本兼容):
IIF(t11.ItemCode IS NULL, 'Y', 'N')
采用 CONCAT 安全地拼接字符串
问题: 传统的用加号 + 拼接字符串时,如果任何一个字段为 NULL,整个结果都会变成 NULL。
旧方法(有风险):
SELECT FirstName + ' ' + LastName AS FullName
FROM Employees;
-- 如果 FirstName 或 LastName 为 NULL,FullName 就会显示为 NULL
小技巧(采用 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 直接表达了“是否存在”的逻辑意图。这两个技巧一个侧重于数据的可靠性和整洁性,另一个侧重于查询的性能优化,都是日常开发中很实用的“利器”。
到此这篇关于Sql Server数据库中isnull、iif、case when三种方式的用法和空值判断的文章就介绍到这了,更多相关sqlserver isnull、iif、case when内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!