É 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] >