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
Condição na clausula where.
-
- 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:
É 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?
-
- 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
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:
e executar o select com o execute immediate =D
você pode coloca-lo em ums String e fazer um if acrescentando um where ou o outro
tipo assim:
vv_string := 'select 1 from dual ';
if v_nada = 1 then
vv_string := vv_string||'where 1 = 1';
end if;
-
- 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:
ou ainda usando o OR:
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:
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
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))
)
-
- 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
A pergunta mais cretina é aquela que não é feita
Esse :var_meta é um parâmetro do relatório??
Se for, dentro do
E sua query principal do relatório fica assim:
Não sei se é isso, mas qualquer coisa estamos aí, um abraço
Se for, dentro do
AFTERPFORM
você pode criar uma váriavel que receberá o seu parâmetro e colocar a condição.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;
select campo1
, campo2
, campo3
from tabela
where campo5 = 1
and campo10 = 52
&P_Where
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes