Nulo não é nada !!!
Encontrei esse título em um capítulo do livro OCA Oracle Database 11g: SQL Fundamentals I – Exam Guide (Exam 1Z0-051) e simplesmente me apaixonei pela definição na verdade o título é NULL Is Nothing traduzi para usar aqui no Blog!
Lembro quando comecei a estudar banco de dados lá em 2008 ainda na faculdade eu tinha o costume de considerar Null como 0 (zero), mas estava errada, nulo não era 0 e também não era um espaço em branco Null simplesmente não é nada, podemos considerar Null como a definição da não existência, ou a existência indefinida?
Antes de começar a estudar para a certificação, já tinha entendido e começado a trabalhar com o Null quase que diariamente, porém nunca havia encontrado uma definição tão simples objetiva e correta sobre a informação Null.
Resolvi escrever um post com essa definição após um dos simulados que fiz para a prova 1Z0-051 onde apareceu a questão abaixo:
Which expressions do not return NULL values? (Choose all that apply.)
A.select ((10 + 20) * 50) + null from dual;
B.select ‘this is a ‘||null||’test with nulls’ from dual;
C.select null/0 from dual;
D.select null||’test’||null as “Test” from dual;
Foi aí que me surgiu uma dúvida em relação a alternativa C, sabemos que qualquer numero divido por 0 vai dar um erro ORA-01476 e que qualquer conta onde um dos fatores seja igual a Null será Null.
Sendo assim ao dividir Null/0 qual regra seria prioritária?
Claro que eu poderia ir no banco e fazer o teste prático mas acabei entrando em um debate filosófico com alguns colegas de trabalho muitos argumentos bons surgiram entre eles que o Oracle iria primeiro validar se era possível executar a query e por isso o erro apareceria ou que o Null simplesmente iria anular tudo inclusive o erro.
Concluímos assim que ir no banco e executar a query seria a melhor solução portanto segue resultado:
O resultado foi Null, porque realmente o nulo não é nada e como dividir nada, como gerar um erro com nada?
Se tentarmos dividir uma palavra ou uma letra por 0 (zero) temos o erro ORA-01722 que é diferente do erro de divisão por 0 (zero) senda o Null igual a nada como seria possível o banco definir qual erro apresentar?
Desta forma podemos concluir com bases práticas e teóricas que o Null não é nada, não é (0) zero e nem um espaço em branco o Null é uma referência de que aquela variável não possui nada.
Null é diferente de Null
Essa é uma outra máxima que temos que lembrar sempre em banco de dados ( e em 99% das linguagens de programação, não escrevo 100% porque não estudei a fundo todas as linguagens de programação) se definir a variável A como Null e a variável B como Null A nunca será igual a B.
Porque como vimos anteriormente Null não é nada é algo totalmente indefinido, como duas coisas indefinidas seriam iguais?
Para comparar variáveis ou colunas que podem ter o valor Null usamos a função NVL
NVL(VARIAVEL,0)
Desta forma ao comparar A com B a sintaxe mudaria de:
Para:
Podemos perceber que a única diferença entre a primeira e a segunda imagem é o uso da função NVL. Recomendo o uso desta função sempre que for comparar colunas que possam conter valores nulos.