NULLIF (Transact-SQL)
适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库
如果两个指定的表达式相等,则返回空值。 例如,SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different;
为第一列(4 和 4)返回 NULL,因为两个输入值相同。 第二列返回第一个值 (5),因为两个输入值不同。
语法
NULLIF ( expression , expression )
参数
expression
为任意有效的标量表达式。
返回类型
返回类型与第一个 expression 相同。
如果两个表达式不相等,则 NULLIF 返回第一个 expression 的值。 如果表达式相等,则 NULLIF 返回第一个 expression 类型的空值。
注解
如果两个表达式相等且结果表达式为 NULL,则 NULLIF 等价于 CASE 搜索表达式。
我们建议在 NULLIF 函数内不要使用依赖于时间的函数,如 RAND()。 这会使函数计算两次并从两次调用中返回不同的结果。
示例
A. 返回尚未更改的预算数量
以下示例创建 budgets
表以显示部门 (dept
) 的当年预算 (current_year
) 以及上一年预算 (previous_year
)。 对于当年预算,那些同上一年相比预算没有改变的部门使用 NULL
,那些预算还没有确定的部门使用 0
。 若要只计算那些接收预算的部门的预算平均值,并包含上一年的预算值(previous_year
为 current_year
时,使用 NULL
的值),请组合使用 NULLIF
和 COALESCE
函数。
CREATE TABLE dbo.budgets
(
dept TINYINT IDENTITY,
current_year DECIMAL NULL,
previous_year DECIMAL NULL
);
INSERT budgets VALUES(100000, 150000);
INSERT budgets VALUES(NULL, 300000);
INSERT budgets VALUES(0, 100000);
INSERT budgets VALUES(NULL, 150000);
INSERT budgets VALUES(300000, 250000);
GO
SET NOCOUNT OFF;
SELECT AVG(NULLIF(COALESCE(current_year,
previous_year), 0.00)) AS [Average Budget]
FROM budgets;
GO
结果集如下。
Average Budget
--------------
212500.000000
(1 row(s) affected)
B. 比较 NULLIF 和 CASE
若要显示 NULLIF
和 CASE
之间的相似性,则以下查询将计算 MakeFlag
和 FinishedGoodsFlag
列中的值是否相同。 第一个查询使用 NULLIF
。 第二个查询使用 CASE
表达式。
USE AdventureWorks2022;
GO
SELECT ProductID, MakeFlag, FinishedGoodsFlag,
NULLIF(MakeFlag,FinishedGoodsFlag) AS [Null if Equal]
FROM Production.Product
WHERE ProductID < 10;
GO
SELECT ProductID, MakeFlag, FinishedGoodsFlag, [Null if Equal] =
CASE
WHEN MakeFlag = FinishedGoodsFlag THEN NULL
ELSE MakeFlag
END
FROM Production.Product
WHERE ProductID < 10;
GO
C. 返回不包含数据的预算数量
如果 current_year
为 null 或包含与 previous_year
相同的数据,则以下示例创建 budgets
表、加载数据,并使用 NULLIF
返回 null。
Copy
CREATE TABLE budgets (
dept TINYINT,
current_year DECIMAL(10,2),
previous_year DECIMAL(10,2)
);
INSERT INTO budgets VALUES(1, 100000, 150000);
INSERT INTO budgets VALUES(2, NULL, 300000);
INSERT INTO budgets VALUES(3, 0, 100000);
INSERT INTO budgets VALUES(4, NULL, 150000);
INSERT INTO budgets VALUES(5, 300000, 300000);
SELECT dept, NULLIF(current_year,
previous_year) AS LastBudget
FROM budgets;
结果集如下。
dept LastBudget
---- -----------
1 100000.00
2 null
3 0.00
4 null
5 null
另请参阅
CASE (Transact-SQL)
decimal 和 numeric (Transact-SQL)
系统函数 (Transact-SQL)