NULLIF (Transact-SQL)
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW) Ponto de extremidade de análise de SQL no Microsoft Fabric Warehouse no Microsoft Fabric Banco de Dados SQL no Microsoft Fabric
Retorna um valor nulo se as duas expressões especificadas forem iguais. Por exemplo, SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different;
retorna NULL para a primeira coluna (4 e 4), pois os dois valores de entrada são os mesmos. A segunda coluna retorna o primeiro valor (5), porque os dois valores de entrada são diferentes.
Convenções de sintaxe de Transact-SQL
Sintaxe
NULLIF ( expression , expression )
Argumentos
expressão
É qualquer expression escalar válida.
Tipos de retorno
Retorna o mesmo tipo que a primeira expression.
NULLIF retorna a primeira expression se as duas expressões não são iguais. Se as expressões forem iguais, NULLIF retornará um valor nulo do tipo da primeira expression.
Comentários
NULLIF é equivalente a uma expressão CASE pesquisada em que as duas expressões são iguais e a expressão resultante é NULL.
É recomendável não usar funções dependentes de tempo, como RAND(), dentro de uma função NULLIF. Isto pode fazer com que a função seja avaliada duas vezes e retorne resultados diferentes nas duas invocações.
Exemplos
a. Retornando valores de orçamento que não foram alterados
O exemplo a seguir cria uma tabela budgets
para mostrar a um departamento (dept
) seu orçamento atual (current_year
) e seu orçamento anterior (previous_year
). Para o ano atual, NULL
é usado para departamentos com orçamentos que não foram alterados em relação ao ano anterior, e 0
é usado para orçamentos que ainda não foram determinados. Para descobrir a média somente dos departamentos que receberam um orçamento e para incluir o valor do orçamento do ano anterior (use o valor previous_year
, em que o current_year
é NULL
), combine as funções NULLIF
e 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
Veja a seguir o conjunto de resultados.
Average Budget
--------------
212500.000000
(1 row(s) affected)
B. Comparando NULLIF e CASE
Para mostrar a semelhança entre NULLIF
e CASE
, as consultas a seguir avaliam se os valores das colunas MakeFlag
e FinishedGoodsFlag
são os mesmos. A primeira consulta usa NULLIF
. A segunda consulta usa a expressão 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
C: Retornando valores de orçamento que não contêm dados
O exemplo a seguir cria uma tabela budgets
, carrega dados e usa o NULLIF
para retornar um valor nulo se current_year
for nulo ou contiver os mesmos dados que 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;
Veja a seguir o conjunto de resultados.
dept LastBudget
---- -----------
1 100000.00
2 null
3 0.00
4 null
5 null
Confira também
CASE (Transact-SQL)
decimal e numeric (Transact-SQL)
Funções de sistema (Transact-SQL)