NULLIF (Transact-SQL)

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 中的 SQL 终结点 Microsoft Fabric 中的仓库 Microsoft Fabric SQL 数据库

如果两个指定的表达式相等,则返回空值。 例如,SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different; 为第一列(4 和 4)返回 NULL,因为两个输入值相同。 第二列返回第一个值 (5),因为两个输入值不同。

Transact-SQL 语法约定

语法

NULLIF ( expression , expression )  

参数

expression
为任意有效的标量表达式

返回类型

返回类型与第一个 expression 相同

如果两个表达式不相等,则 NULLIF 返回第一个 expression 的值。 如果表达式相等,则 NULLIF 返回第一个 expression 类型的空值

注解

如果两个表达式相等且结果表达式为 NULL,则 NULLIF 等价于 CASE 搜索表达式。

我们建议在 NULLIF 函数内不要使用依赖于时间的函数,如 RAND()。 这会使函数计算两次并从两次调用中返回不同的结果。

示例

A. 返回尚未更改的预算数量

以下示例创建 budgets 表以显示部门 (dept) 的当年预算 (current_year) 以及上一年预算 (previous_year)。 对于当年预算,那些同上一年相比预算没有改变的部门使用 NULL,那些预算还没有确定的部门使用 0。 若要只计算那些接收预算的部门的预算平均值,并包含上一年的预算值(previous_yearcurrent_year 时,使用 NULL 的值),请组合使用 NULLIFCOALESCE 函数。

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

若要显示 NULLIFCASE 之间的相似性,则以下查询将计算 MakeFlagFinishedGoodsFlag 列中的值是否相同。 第一个查询使用 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)