É verdade André, muito bem observado : a Oracle mesmo já documenta isso, no 
manual "SQL Reference" do 10gr2 ela ressalva :

"In a DECODE function, Oracle considers two nulls to be equivalent."

 Sobre a solução que vc propõe, aí depende : ele quer checar só a possibilidade 
da bind variable estar nula ** OU **, como eu disse, ele quer/precisa checar a 
possibilidade da coluna estar nula também , E SE isso acontecer os registros 
com vendedor NULOS devem vir, independente da bind  ??? Pois com o código :

AND ( p_vendedor IS NULL OR vendedor = p_vendedor )

 OBVIAMENTE, numa comparação de Igualdade, sem decode envolvido, se a coluna 
vendedor for null e a variável p_vendedor estiver preenchida, valor existente 
nunca vai ser igual a NULL...
 Por isso que a minha proposta foi verificar diretamente se a coluna tá null :

and ( vendedor is null
 OR vendedor like nvl(p_vendedor, '%')
    );
 
 Pois eu entendi que quando a coluna vendedor for nula o registro deve vir de 
qquer maneira, e quando a coluna não for nula aí sim se a variável bind for 
nula vem qquer registro (representado pelo like com %) e se a bind não for nula 
aí a comparação é normal...
 Mas só o colega lá que perguntou pode Comprovar ou Negar essa SUPOSIÇÃO sobre 
a lógica desejada.... 
 E É claro, também, ele tinha proposto LIKE, então eu fui atrás, sabe-se lá se 
é LIKE mesmo que ele precisa ou é Igualdade....

 []s

  Chiappa
 
--- Em oracle_br@yahoogrupos.com.br, Andre Santos <andre.psantos.ti@...> 
escreveu
>
> Pessoal
> 
> Só uns pitacos a mais... ;)
> 
> DECODE é uma das poucas exceções para comparação de igualdade com nulo
> (NULL).
> Ou seja, dentro do DECODE, NULL é igual a NULL sim!
> 
> Exemplo:
> SQL> select
>   2  decode(NULL,
>   3  NULL, 'nulo',
>   4  'não-nulo') teste_nulo,
>   5  --
>   6  decode( 1,
>   7  NULL, 'nulo',
>   8  'não-nulo') teste_valor
>   9  --
>  10  from dual;
> 
> TESTE_NULO TESTE_VALOR
> ---------- -----------
> nulo       não-nulo
> 
> 
> Uma solução (adaptada da última que o Chiappa mencionou), imaginando que
> "p_vendedor" é um parâmetro opcional:
> 
> WHERE cliente = 10
> AND ( p_vendedor IS NULL OR vendedor = p_vendedor )
> 
> [ ]'s
> 
> André Santos
> 
> 
> 
> 
> Em 17 de julho de 2013 12:25, J. Laurindo Chiappa
> <jlchiappa@...>escreveu:
> 
> > **
> >
> >
> > np... Observo que :
> >
> > - em outra msg , vc disse que na verdade o elemento a comparar era uma
> > bind variable, então vc deveria aplicar é nela o NVL...
> > E SE a coluna vendedor é nulificável (o que é possível, acho eu) ,imagino
> > que vc vai querer prever isso (já que como disse uma coluna NULLificada não
> > é igual a NADA, não é LIKE nada, é um valor Ignorado), assim ficaria tipo :
> >
> > WHERE cliente = 10
> > and ( vendedor is null
> > OR vendedor like nvl(p_vendedor, '%')
> > );
> >
> >
> > []s
> >
> > Chiappa
> >
> > --- Em oracle_br@yahoogrupos.com.br, Elcio Francisco <elciofrancisco@>
> > escreveu
> > >
> > > vou testar aqui e muito obrigado....
> > >
> > > Elcio
> > >
> > > ________________________________
> > > De: J. Laurindo Chiappa <jlchiappa@>
> >
> > > Para: oracle_br@yahoogrupos.com.br
> > > Enviadas: Quarta-feira, 17 de Julho de 2013 11:47
> > > Assunto: [oracle_br] Re: Ajuda Decode
> > >
> > >
> > >
> > >
> > > O DECODE em si funciona e é aceito na boa na cláusula WHERE, no ORDER BY
> > , no SELECT, sem problemas.... O seu problema neste caso demonstrado é que
> > o DECODE faz comparações de IGUALDADE, e NULL nunca é igual a nada , NULL
> > nunca é diferente de nada , NULL só pode ser comparado com um operador
> > especial, o ISNULL, ou então trocando o NULL por um valor detrminado : isso
> > é a lógica TRI-VALORADA no RDBMS Oracle, o NULL é um valor ignorado,
> > portanto não é igual, não é menor, não é maior que um escalar...
> > > Assim, POR CAUSA DO NULL, penso que a sua comparação poderia ser melhor
> > definida como algo do tipo :
> > >
> > > WHERE cliente = 10
> > > and vendedor like nvl(vendedor, '%');
> > >
> > > OU SEJA, se vendedor for NULL vc considera um %, caso contrário vc usa o
> > valor na coluna vendedor.... okdoc ?
> > >
> > > []s
> > >
> > > Chiappa
> > > --- Em oracle_br@yahoogrupos.com.br, Elcio Francisco <elciofrancisco@>
> > escreveu
> >
> > > >
> > > > Bom dia Pessoal, gostaria de saber se o decode funciona no filtro.
> > Quando tem o vendedor mostra o selecionado quando não tem mostra todos.
> > Porem não esta funcionando.
> > > >
> > > > Alguem pode me ajudar?
> > > >
> > > > Obrigado
> > > >
> > > >
> > > > WHERE cliente = 10
> > > >   and vendedor like decode (vendedor,null,'%',1)
> > > >
> > > >
> > > > Banco : Oracle Database 10g Release 10.2.0.4.0 - Production
> > > > PL/SQL Release 10.2.0.4.0 - Production
> > > >
> > > > Elcio
> > > >
> > > > [As partes desta mensagem que não continham texto foram removidas]
> > > >
> > >
> > >
> > >
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> >
> >  
> >
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


Responder a