NULLIF (Transact-SQL)
Retorna um valor nulo se as duas expressões especificadas forem iguais.
Convenções da sintaxe Transact-SQL
Sintaxe
NULLIF ( expression , expression )
Argumentos
- expression
É qualquer expressão escalar válida.
Tipos de retorno
Retorna o mesmo tipo que a primeira expression.
NULLIF retornará a primeira expression se as duas expressões não forem 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.
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
Aqui está 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 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