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:
Postar um comentário