Поделиться через


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

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в Microsoft Fabric

Возвращает значение NULL, если два указанных выражения равны. Например, SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different; возвращает значение NULL для первого столбца (4 и 4), так как два входных значения одинаковы. Для второго столбца возвращается первое значение (5), так как два входных значения различаются.

Соглашения о синтаксисе 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.

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  

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

В примере ниже создается таблица budgets, загружаются данные, а затем с помощью NULLIF возвращается значение NULL, если current_year равно NULL или содержит те же данные, что и previous_year.


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)
десятичная и числовая (Transact-SQL)
Системные функции (Transact-SQL)