NULLIF (Transact-SQL)

如果两个指定的表达式相等,则返回空值。

主题链接图标 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。 若要只计算那些接收预算的部门的预算平均值,并包含上一年的预算值(current_year 为 NULL 时,使用 previous_year 的值),请组合使用 NULLIF 和 COALESCE 函数。

USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.budgets','U') IS NOT NULL
   DROP TABLE budgets;
GO
SET NOCOUNT ON;
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 AdventureWorks2012;
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

请参阅

参考

CASE (Transact-SQL)

decimal 和 numeric (Transact-SQL)

系统函数 (Transact-SQL)