Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como NULLIF() funciona no SQL Server


No SQL Server, o NULLIF() expressão verifica o valor de duas expressões especificadas. Retorna um valor nulo se forem iguais, caso contrário, retorna a primeira expressão.

Sintaxe


A sintaxe fica assim:
NULLIF ( expression , expression )

Exemplo


Segue um exemplo para demonstrar:
SELECT NULLIF(3, 3);

Resultado:
NULL

Aqui, ambas as expressões são iguais e, portanto, o resultado é um valor nulo.

Veja o que acontece quando as expressões não são iguais:
SELECT NULLIF(3, 7);

Resultado:
3

Desta vez, o primeiro valor é retornado.

Aqui está um exemplo que encapsula os dois resultados:
SELECT 
    NULLIF(0, 0) AS a,
    NULLIF(3, 3) AS b,
    NULLIF(3, 0) AS c,
    NULLIF(0, 3) AS d;

Resultado:
+------+------+-----+-----+
| a    | b    | c   | d   |
|------+------+-----+-----|
| NULL | NULL | 3   | 0   |
+------+------+-----+-----+

Um exemplo prático


Suponha que temos uma tabela com os seguintes dados:
SELECT 
    ProductName,
    ProductPrice
FROM Products;

Resultado:
+-------------------------------------+----------------+
| ProductName                         | ProductPrice   |
|-------------------------------------+----------------|
| Left handed screwdriver             | 25.99          |
| Long Weight (blue)                  | 14.75          |
| Long Weight (green)                 | 11.99          |
| Smash 2000 Sledgehammer             | 0.00           |
| Chainsaw (includes 3 spare fingers) | 0.00           |
| Straw Dog Box                       | NULL           |
| Bottomless Coffee Mugs (4 Pack)     | 9.99           |
| Right handed screwdriver            | 25.99          |
+-------------------------------------+----------------+
(8 rows affected)

E suponha que queremos descobrir quantos produtos têm um preço positivo. Em outras palavras, não queremos incluir produtos que tenham preço ou valor zero ou nulo.

Para fazer isso, podemos usar NULLIF() em conjunto com o COUNT() função:
SELECT 
    COUNT(NULLIF(ProductPrice, 0.00)) AS Result
FROM Products;

Resultado:
+----------+
| Result   |
|----------|
| 5        |
+----------+
Warning: Null value is eliminated by an aggregate or other SET operation.

Obtemos 5 conforme o esperado, que é exatamente quantas linhas têm um valor positivo no ProductPrice coluna.

Isso funciona porque o COUNT() função conta apenas valores não nulos. Ao converter os valores zero em nulos, podemos ignorar esses valores em nosso cálculo.

Aqui está novamente sem o NULLIF() função.
SELECT COUNT(ProductPrice) AS Result
FROM Products;

Resultado:
+----------+
| Result   |
|----------|
| 7        |
+----------+
Warning: Null value is eliminated by an aggregate or other SET operation.

Desta vez, inclui os valores zero e obtemos 7. Ele ainda ignora a linha 6 porque na verdade ela tem um valor nulo.

Quando o primeiro argumento é a constante nula


A função não aceita a constante nula como seu primeiro argumento:
SELECT NULLIF(null, 3);

Resultado:
Msg 4151, Level 16, State 1, Line 1
The type of the first argument to NULLIF cannot be the NULL constant because the type of the first argument has to be known.

Como a mensagem de erro indica, o tipo do primeiro argumento deve ser conhecido. O valor de retorno da função usa o tipo de dados da primeira expressão e esse erro reflete isso.

Este erro deve ser bastante raro. Na maioria dos casos, você passará um nome de coluna como o primeiro argumento e, no SQL Server, as colunas têm um tipo de dados definido. Nesses casos, um valor nulo será realmente aceito, pois o SQL Server conhece o tipo de dados da coluna.

O mesmo pode ser dito para as variáveis. Se você passasse uma variável, teria que declarar seu tipo e, portanto, não obteria o erro.

Contagem de argumentos inválida


Chamar a função sem passar nenhum argumento resulta em um erro:
SELECT NULLIF();

Resultado:
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ')'.

E passar muitos argumentos também causa um erro:
SELECT NULLIF(1, 2, 3);

Resultado:
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ','.