NULLIF (Transact-SQL)

Изменения: 12 декабря 2006 г.

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

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

Синтаксис

NULLIF ( expression , expression )

Аргументы

  • expression
    Любое допустимое скалярное выражение.

    Дополнительные сведения см. в разделе Выражения (Transact-SQL).

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

Возвращает значение того же типа, который имеет первого выражение 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 AdventureWorks;
GO
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'budgets')
   DROP TABLE budgets;
GO
SET NOCOUNT ON;
CREATE TABLE 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 AdventureWorks;
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)
десятичные и числовые (Transact-SQL)
Системные функции (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

12 декабря 2006 г.

Новое содержимое
  • Добавлены сведения о применении зависимых от времени функций в функции NULLIF.

14 апреля 2006 г.

Новое содержимое.
  • Добавлен пример, демонстрирующий схожесть между функциями NULLIF и CASE.