Функция 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)