Функция NULLIF (Transact-SQL)

Возвращает значение NULL, если два указанных выражения равны.

Применимо для следующих объектов: SQL Server (SQL Server 2008 по текущую версию), База данных SQL Windows Azure (С первоначального выпуска по текущий выпуск).

Значок ссылки на раздел Синтаксические обозначения в Transact-SQL

Синтаксис

NULLIF ( expression , expression )

Аргументы

Типы возвращаемых данных

Возвращает значение того же типа, который имеет первого выражение expression.

Если выражения не эквивалентны, функция NULLIF возвращает первое указанное выражение expression. Если они эквивалентны, функция NULLIF возвращает значение NULL, имеющее тип, соответствующий типу первого выражения expression.

Замечания

Функция NULLIF аналогична поисковому выражению CASE, в котором два выражения равны, а результирующее выражение равно NULL.

В функции NULLIF не рекомендуется использовать такие зависимые от времени функции, как RAND(). Это может приводить к тому, что функция будет вычисляться дважды с возвратом различных результатов для каждого из вызовов.

Примеры

А.Возвращение неизменившихся сумм бюджета

В следующем примере производится создание таблицы budgets для отображения отдела (dept), его текущего (current_year) и предыдущего бюджета (previous_year). Для текущего года для отдела, бюджет которого не изменился с предыдущего года, выводится значение NULL, а значение 0 указывается для указания того, что бюджет еще не определен. Для получения среднего значения только для тех отделов, которым уже назначен бюджет и включения значения прошлогоднего бюджета (используется значение previous_year, если current_year равен NULL), используются функции 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)

Б.Сравнение функции 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)