sábado, 24 de novembro de 2012

TRATAMENTO DE NULL (NULL IN FIELDS)


Uma query  (SELECT) retorna do banco de dados todas as linhas para as quais a cláusula WHERE retorna True (verdadeiro). Muitos desenvolvedores se confundem assumindo que a consulta retornará todos os registros para os quais a cláusula WHERE retorne qualquer valor diferente de False (Falso). Isto é uma causa comum de relatórios incompletos.

Para explicar a razão, considere que a linguagem SQL usa uma lógica de três valores: True, False e Null (Nulo). Qualquer valor Null em uma expressão torna toda a expressão Null (com algumas exceções citadas abaixo).

Exemplo: O senso comum sugere que o SELECT abaixo retorne todas as linhas em uma tabela:

SELECT * FROM Pedidos WHERE (total < 1000 Or total >= 1000)

O SELECT não incluirá os registros para os quais o campo Total é Null, porque este valor faz com que toda a expressão contida na cláusula WHERE seja avaliada como Null.

SELECT * FROM Pedidos WHERE Total = 0

A consulta acima retorna todos os pedidos para os quais Total é zero, mas não aqueles para os quais o Total é Null. Se você quer incluir estes últimos, precisa pesquisar explicitamente pelos valores Null:

SELECT * FROM Pedidos WHERE total = 0 OR total IS NULL

ISNULL é uma função  T-SQL que é constantemente usada para lidar com valores Null. Simplesmente, ela sempre retorna o seu primeiro argumento exceto quando ele é Null (neste caso ela retorna o segundo argumento). Veja como você pode reescrever a consulta acima para lidar com valores Null:

-- converte valores Null para zero antes de compará-los
SELECT * FROM Pedidos WHERE ISNULL(total, 0) = 0 

Além disto, a T-SQL estende o padrão ANSI 92 e suporta Null também em cláusulas IN, de modo que você pode reescrever a consulta acima como abaixo:

SELECT * FROM Pedidos WHERE total IN (0, NULL)

Podemos, também, fazer a consulta inversa, procurando na tabela todos os registros cujo campo especificado seja diferente de Null.

SELECT * FROM Pedidos WHERE total IS NOT NULL

Agora, imagine se você quiser usar o comando CASE para testar os resultados com valor Null.

x
1
2
NULL
4
5

Este seria o método de entendimento direto de como fazer:


SELECT x,CASE x
WHEN NULL THEN ‘sim’
ELSE ‘nao’
END AS resultado
FROM Tabela


O resultado esperado seria:

x resultado
1 nao
2 nao
NULL sim
4 nao
5 nao

Mas ao invés disto teremos exatamente esse resultado:

x resultado
1 nao
2 nao
NULL nao
4 nao
5 nao

Mas então, porque não funcionou? Eu respondo:
NULL é desconhecido, NULL não é igual a NULL, e NULL é a "coisa" mais estranha que pode existir num banco de dados, comum sim, normal não.


Este seria o código exato:

SELECT x,
CASE
WHEN x IS NULL THEN ‘sim’
ELSE ‘nao’
END AS resultado
FROM Tabela



Espero que tirem proveito deste conhecimento. Até mais!


Nenhum comentário: