Pesquisar este blog

quarta-feira, 28 de outubro de 2009

Lidando com valores NULL

Um campo com valor null no padrão SQL indica que o valor é desconhecido. Null é diferente de vazio ou zero e dois valores null são diferentes entre si. Ao comparar um valor null com outro valor também null ou ainda, comparar um valor null com outros valores conhecidos sempre dará um resultado desconhecido (Unknown) porque não podemos determinar o valor de cada campo.

Registros com valor nulo geralmente indicam ausência de valores ou que os valores serão informados futuramente.

Neste artigo mostraremos uma série de consultas SQL e o resultado obtido quando tuplas contém valores nulo.

Para nossos exemplos segue nosso esquema:

SQL> desc dept
Nome Nulo? Tipo
------------------------------------
DEPT_NO NUMBER(38)
NOME VARCHAR2(20)

SQL> desc func
Nome Nulo? Tipo
-------------------------------------------
FUNC_NO NUMBER(38)
NOME VARCHAR2(20)
DEPTNO NUMBER(38)
SAL NUMBER(12,2)

SQL> select * from dept;

DEPT_NO NOME
---------- --------------------
1 RH
2 COMERCIAL
3 INFORMATICA

SQL> select * from func;

FUNC_NO NOME DEPTNO SAL
---------- -------------------- ---------- ----------
1 JOAO 1 1000
2 MARIA 2 1000
3 ZE
4 LEO 3 1000



NULLS em expressões escalares


Como sabemos, qualquer expressão escalar envolvendo nulo retorna null como resultado. A query a seguir exemplifica o que ocorre ao realizar um aumento de salário de R$ 100,00 para todos os funcionários:


SQL> select func_no, nome, deptno, sal+100 from func;

FUNC_NO NOME DEPTNO SAL+100
---------- -------------------- ---------- ----------
1 JOAO 1 1100
2 MARIA 2 1100
3 ZE
4 LEO 3 1100


Conclusão: O servidor do banco de dados não pode somar 100 reais a null e por isso o resultado é nulo. Se quisermos realizar está consulta e aparecer um valor de salário para todos os funcionários podemos utilizar a função Ansi coalesce, que substitui o null por zero antes de realizar o cálculo matemático. Claro que, utilizar coalesce vai depender muito da regra de negócio em questão, pois você certamente não vai querer sair colocando coalesce em tudo que é SQL. Talvez uma solução mais correta neste exemplo é alterar o esquema da tabela func para não permitir nulo no salário, forçando assim ter um salário válido.

A query a seguir repete a mesma consulta, mas usando a função Ansi Coalesce:

SQL> select func_no, nome, deptno, coalesce(sal,0)+100 from func;

FUNC_NO NOME DEPTNO COALESCE(SAL,0)+100
---------- -------------------- ---------- -------------------
1 JOAO 1 1100
2 MARIA 2 1100
3 ZE 100
4 LEO 3 1100

Neste exemplo, o servidor do banco de dados fez o que queríamos. Usar a função coalesce é muito importante para evitar erros nas consultas SQL. O Oracle ainda possui várias outras funções para lidar com null: nvl, nvl2, nullif. Vale a pena dar uma olhada nestas funções. Existe também a expressão case que pode ser muito útil também.