Olá Elcio

   Considerenado sendo NULL o valor da variavel, eu escreveria a Query assim :


select rc.cli_nome
  from crd.analise fb, crd.recusado rc 
 where fb.cpf_cgc = rc.cli_cpf_cgc                 
   and ( rc.cli_nome LIKE '%', upper(v_nome) || '%' OR v_nome is null)
   and ( rc.cli_cpf  LIKE '%', upper(v_cpf)  || '%' OR v_cpf  is null)
 order by fb.data_inclusao desc
 
Alessandro Lúcio Cordeiro da Silva 
        Analista de Sistema
þ http://alecordeirosilva.blogspot.com/
O tic-tac do relógio me lembra de algo muito importante que esta acontecendo: 
estamos vivos.
                                "Joana de Souza Schmitz Croxato"
 


________________________________
 De: J. Laurindo Chiappa <jlchia...@yahoo.com.br>
Para: oracle_br@yahoogrupos.com.br 
Enviadas: Terça-feira, 7 de Agosto de 2012 13:13
Assunto: [oracle_br] Re: DECODE/CASE
 

  
Élcio, tá meio confuso esse texto, mas SUPONDO que com "em branco" vc quis 
dizer NULL (são coisas diferentes uma variável e/ou coluna não-preenchida E uma 
com brancos) E QUE seja apenas as variáveis externas v_xx que possam conter 
NULLs (e não as colunas das tabelas) vc simplesmente tem que tratar os NULLs, 
pois como sabemos um NULL nunca é igual a nada, nunca é diferente de nada, NULL 
é um valor DESCONHECIDO, isso é a Base da lógica tri-valorada (Verdade, Falso 
ou NULO) no RDBMS Oracle .... Outro ponto é o citado em 
http://www.oratechinfo.co.uk/nulls.html#null11 , de que o LIKE (óbvio) espera 
receber uma string com wild characters, portatnto VAI ignorar NULOs, NULLs não 
são iguais a uma string nunca ....
Não dá pra saber à distância, mas me parece que vc está caindo nesssas falhas 
acima - uma tratativa possível é 'transformar' os NULLs em algum valor via NVL, 
tenta isso - abaixo um exemplo, NÃO o mais performático nem o "melhor", mas 
apenas uma prova de conceito, e SEM usar DECODE ou CASE, já que não há 
necessidade deles em princípio ao que entendo  : 

SCOTT@O10GR2::SQL>l
SCOTT@O10GR2::SQL>select e.deptno, d.dname, e.empno, e.ename from emp e, dept d
2   where e.deptno = d.deptno
3*    and upper(e.ename) like upper( '%' || nvl(:v_ename, e.ename) || '%')

=> vou criar a variável, que como toda variável se nada for indicado é criada 
como Vazia, NULA :

SCOTT@O10GR2::SQL>variable V_ENAME varchar2(40)
SCOTT@O10GR2::SQL>print v_ename

V_ENAME
----------------------------------------------------------

SCOTT@O10GR2::SQL>

==> executo com a variável nula, o nvl bota o valor da coluna na string e 
portanto vem todo mundo :

DEPTNO DNAME                       EMPNO ENAME
------------------ -------------- ------------------ ----------
20 RESEARCH                     7369 SMITH
30 SALES                        7499 ALLEN
30 SALES                        7521 WARD
20 RESEARCH                     7566 JONES
30 SALES                        7654 MARTIN
30 SALES                        7698 BLAKE
10 ACCOUNTING                   7782 CLARK
20 RESEARCH                     7788 SCOTT
10 ACCOUNTING                   7839 KING
30 SALES                        7844 TURNER
20 RESEARCH                     7876 ADAMS
30 SALES                        7900 JAMES
20 RESEARCH                     7902 FORD
10 ACCOUNTING                   7934 MILLER
10 ACCOUNTING                   7777 allende

15 linhas selecionadas.

=> vou passar um argumento , o NVL não mexe no valor :

SCOTT@O10GR2::SQL>exec :v_ename := 'all';

Procedimento PL/SQL concluido com sucesso.

SCOTT@O10GR2::SQL>/

DEPTNO DNAME                       EMPNO ENAME
------------------ -------------- ------------------ ----------
30 SALES                        7499 ALLEN
10 ACCOUNTING                   7777 allende

SCOTT@O10GR2::SQL>

[]s

Chiappa


--- Em oracle_br@yahoogrupos.com.br, Elcio Francisco <elciofrancisco@...> 
escreveu
>
> Pessoal tenho uma query aqui, onde o usuario pode consultar por CPF ou por 
> NOME. Porem do jeito que ela esta se o nome for branco não traz nada. Eu 
> preciso colocar no filtro para buscar apenas o CPF ou o NOME do jeito que 
> esta ele busca os 2 campos.
> 
> Alguem pode me ajudar
> 
> 
> 
>                                       select rc.cli_nome
>                                         from crd.analise fb
>                                             ,crd.recusado        rc 
>                                       where  fb.cpf_cgc              = 
> rc.cli_cpf_cgc                 
>                                         and rc.cli_nome  LIKE 
> DECODE(upper(v_nome),NULL,'%', upper(v_nome) || '%')                          
>                                                  
> 
>                                         and rc.cli_cpf  LIKE 
> DECODE(upper(v_cpf),NULL,'%', upper(v_cpf) || '%')
>                            order by fb.data_inclusao desc
> 
> 
> Muito Obrigado
>  
> Elcio Francisco  
> 
> P Antes de imprimir pense em sua responsabilidade com o MEIO AMBIENTE
>          Adote os 3Rs na sua vida: Reduza, Reutilize, Recicle!
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


 

[As partes desta mensagem que não continham texto foram removidas]

Responder a