[Dica] Comparação de Campos NULL

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:

Sabemos que quando um variável ou um campo no Oracle está NULL, ele não pode ser simplesmente comparado a um outro valor, pois o resultado da compração também será false!

Selecionar tudo

declare
  a number:=null;
  b number:=null;
begin
  if a=b
  then dbms_output.put_line('SIM');
  else  dbms_output.put_line('não');  
  end if;
end;

SQL> / 
não
POUCO EFICIENTE

Para "sanar" este problema, é possivel usar NVL, que não é uma boa prática. Veremos porque:

Selecionar tudo

if nvl(a, 123456789) = nvl(b, 123456789)
then --seu código
Isso funciona, se o valor for diferente de 123456789. Se o valor for igual, ferra a comparação!

MUITO EFICIENTE

A melhor prática possível

É um pouco trabalhosa, mas sempre funcionará:

Selecionar tudo

if a<>b
or (a is null and b is not null)
or (a is not null and b is null)
then --seu codigo
charlesmafra
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Qui, 19 Ago 2004 9:45 am
Localização: Angola
Contato:
Charles Mafra
Oracle Developer

Como podem ver Null não é igual, ou diferente
de null, ou maior ou menor.

Quando você compara Null, deve ser sempre
IS NULL ou IS NOT NULL

Cuidado quando você usa NVL em consultas do tipo:

Selecionar tudo

select 1 from  TABELA
WHERE codigo = NVL(VARIAVEL, codigo  )
Isso funciona pra trazer todos os valores da Tabela quando a variavel for igual ao código, mas se o código for Null, não funcionará...

prefira usar:

Selecionar tudo

select 1 from  TABELA
WHERE codigo = VARIAVEL
OR       (codigo is null and VARIAVEL is null)




O código abaixo não mostra nada.

Selecionar tudo

SQL> SET SERVEROUTPUT ON
SQL> DECLARE 
  2  A NUMBER DEFAULT NULL;
  3  B NUMBER DEFAULT NULL;
  4  BEGIN
  5    IF A = B THEN
  6       DBMS_OUTPUT.PUT_LINE('NULL É IGUAL A NULL');
  7    ELSIF A != B THEN
  8       DBMS_OUTPUT.PUT_LINE('NULL É DIFERENTE DE NULL');
  9    END IF;
 10  END;
 11  /
Procedimento de PL/SQL concluído com êxito.
alexandre5150
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Sex, 13 Jun 2008 9:53 am
Localização: NOVO HAMBURGO - RS

Resumindo:

SEMPRE, qualquer comparação com NULL retorna FALSE.
Sabendo isso, é só utilizar as funções ou IS NULL/IS NOT NULL para comparar.

Falow...
rodcapella
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Ter, 07 Jul 2009 10:26 am
Localização: Rio de Janeiro - RJ
_________________
Rodrigo Póvoa
Analista de Sistemas Júnior
Oracle Developer

Boa dica !!!

Muita gente acaba esquecendo desses detalhes enquanto está codificando.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 13 visitantes