Condição na clausula where.

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
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Pessoal estou em um angú de caroço, preciso montar um select da seguinte forma:

Selecionar tudo

select campo1, campo2, campo3
from tabela
where campo5 = 1
and campo10 = 52
case when :var_meta = 1 then
 and campo11 in (select cod from tabl)
else
 and campo11 not in (select cod from tabl)
end
order by campo1
É algo bem sinistro, com base em um parâmetro externo preciso alterar a cláusula where, isso é possível? Se não existe algum paliativo?
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

Depende, pra que você vai usar o select ??

você pode coloca-lo em ums String e fazer um if acrescentando um where ou o outro
tipo assim:

Selecionar tudo

vv_string := 'select 1 from dual ';
if v_nada = 1 then
   vv_string := vv_string||'where 1 = 1';
end if;
e executar o select com o execute immediate =D
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Esqueci de dizer mas vou executar esse select para montar um report e está soda resolver isso.
Tentei com if e não rolou também.
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

A melhor forma de se fazer isto seria fazer duas consultas separadas.
Pois quando o banco for montar o plano de execução de sua consulta, ele não terá acesso ao valor de sua variável :var_meta, e tentará montar um plano de execução "genérico", que pode prejudicar muito a performance da query para determinados parâmetros.

Caso realmente seja impossível criar duas consultas distintas, existem duas soluções simples para o problema:

Usando o UNION para cada valor do parâmetro de entrada:

Selecionar tudo

select campo1
     , campo2
     , campo3
from  tabela
where campo5 = 1
and   campo10 = 52
and   :var_meta = 1 
and campo11 in (select cod from tabl)
union all
select campo1
     , campo2
     , campo3
from  tabela
where campo5 = 1
and   campo10 = 52
and   :var_meta != 1 
and campo11 not in (select cod from tabl)
order by campo1 
ou ainda usando o OR:

Selecionar tudo

select campo1
     , campo2
     , campo3
from   tabela
where  campo5 = 1
and    campo10 = 52
and    (
         (:var_meta = 1 and campo11 in (select cod from tabl))
         or
         ( :var_meta != 1 and campo11 not in (select cod from tabl))
       )
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

Esse :var_meta é um parâmetro do relatório??

Se for, dentro do AFTERPFORM você pode criar uma váriavel que receberá o seu parâmetro e colocar a condição.

Selecionar tudo

if :var_meta = 1 then
 P_where := P_where||' and campo11 in (select cod from tab 1) ';
else
 P_where := P_where||' and campo11 not in (select cod from tab 1) ';
end if;
E sua query principal do relatório fica assim:

Selecionar tudo

select campo1
     , campo2
     , campo3
from  tabela
where campo5 = 1
and   campo10 = 52 
&P_Where
Não sei se é isso, mas qualquer coisa estamos aí, um abraço
Responder
  • Informação
  • Quem está online

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