NULLIF (Transact-SQL)

Retorna um valor nulo se as duas expressões especificadas forem iguais.

Ícone de vínculo de tópicoConvenções de 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 AdventureWorks2008R2;
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.

Média de orçamento

--------------

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 AdventureWorks2008R2;
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