[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
  

Mensagemem Sáb, 15 Mai 2004 7:14 pm

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!

Código: Selecionar todos
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:

Código: Selecionar todos
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á:
Código: Selecionar todos
if a<>b
or (a is null and b is not null)
or (a is not null and b is null)
then --seu codigo
dr_gori
Localização: Portland, OR USA

Mensagemem Qui, 19 Ago 2004 11:24 am

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:

Código: Selecionar todos
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:

Código: Selecionar todos
select 1 from  TABELA
WHERE codigo = VARIAVEL
OR       (codigo is null and VARIAVEL is null)






O código abaixo não mostra nada.
Código: Selecionar todos
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.
charlesmafra
Localização: Angola

Charles Mafra
Oracle Developer

Mensagemem Ter, 07 Jul 2009 8:12 am

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...
alexandre5150
Localização: NOVO HAMBURGO - RS

Mensagemem Sex, 17 Jul 2009 12:15 pm

Boa dica !!!

Muita gente acaba esquecendo desses detalhes enquanto está codificando.
rodcapella
Localização: Rio de Janeiro - RJ

_________________
Rodrigo Póvoa
Analista de Sistemas Júnior
Oracle Developer


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


    Voltar para PL/SQL

    Quem está online

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