condição IF dentro do 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
carlosabc
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Seg, 28 Jul 2008 9:39 am
Localização: Niterói - RJ

Pessoal, sou novato em fazer packages no Oracle. Fiz uma aqui, porém, preciso colocar a seguinte condição dentro da minha cláusula where. (segue exemplo abaixo).

Selecionar tudo

SELECT CAMPO1, CAMPO2, CAMPO3 FROM TABELA WHERE 
CAMPO1 = parametro1 AND
IF parametro2 = 0 THEN
   CAMPO2 = 0 AND
ELSE
   CAMPO2 <> 0 AND
END IF
CAMPO3 = 5;
Se alguém puder postar exemplo com a sintaxe correta, eu agradeço.
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP
Julian de A. Campagnoli
Treinee, Desenvolvedor Oracle PL-SQL

Tudo bem carlos ????

Brother não é possivel trabalhar com CONDICOES(IF,ELSE ... etc) na cláusula WHERE.

Obs.: Do jeito que você está fazendo sua QUERY além de fazer uma busca ela esta atualizando os registros simultaneamente.

Pelo que entendi você esta fazendo isso em Procedure PL-SQL.
De uma olhada na parte de CURSOR (PL-SQL).


Abraço, qualquer coisa estamos aqui
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP
Julian de A. Campagnoli
Treinee, Desenvolvedor Oracle PL-SQL

Vou postar um exemplo básico para que você vizualize melhor a estrutura de um bloco PL-SQL.

Estrutura de um Bloco PL-SQL

Selecionar tudo

DECLARE
   
   CURSOR cur  IS
        SELECT *
           FROM TABLE
         WHERE CAMPO1 = param1;
 

BEGIN
   
     /* CONDIÇÕES E REGRAS SERIAM TRATADAS AQUI */
     IF (CAMPO2 = 0) THEN
       ...
    ELSE
       ...
    END IF;

END;

Abraço
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP
Julian de A. Campagnoli
Treinee, Desenvolvedor Oracle PL-SQL

Desconsidere o exemplo acima por favor. Fazer responder as pressas sai erro. rsrsrsrsrs

Selecionar tudo

DECLARE 
    
   CURSOR cur  IS 
        SELECT * 
           FROM TABLE 
         WHERE CAMPO1 = param1; 
   
    C1   cur%ROWTYPE;

Selecionar tudo

BEGIN 
    
    OPEN cur;
    LOOP
       FETCH cur INTO C1 ;
       IF cur%NOTFOUND THEN
           EXIT;
       ELSE
           /* CONDIÇÕES E REGRAS SERIAM TRATADAS AQUI */ 
    END LOOP;
    CLOSE cur;

END; 
joaogarcia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 91
Registrado em: Ter, 20 Mar 2007 7:19 pm
Localização: Campinas - SP
Contato:
Cordialmente,
João C. Garcia

Isso também é uma possível solução...
Só explicando mais detalhado, a query retornará os dados onde o CAMPO1 seja igual ao parametro1 e o CAMPO3 igual a 5, porém se o parametro2 for igual a zero, buscará os dados onde o CAMPO2 é igual a zero, mas se o parametro2 for diferente de zero, buscará os dados onde o CAMPO2 seja diferente de zero.

Selecionar tudo

SELECT CAMPO1, CAMPO2, CAMPO3 
  FROM TABELA 
WHERE CAMPO1 = parametro1 
  AND (  (parametro2 = 0 AND CAMPO2 = 0) OR
         (parametro2 <> 0 AND CAMPO2 <> 0) )
  AND CAMPO3 = 5;
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP
Julian de A. Campagnoli
Treinee, Desenvolvedor Oracle PL-SQL

joaogarcia vlw por ter respondido a dúvida,

Eu acabei interpretando errado a questao do nosso amigo carlos.

Na correria acabei interpretando que CAMPO2 estava recebendo valor 0.

Abraço
carlosabc
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Seg, 28 Jul 2008 9:39 am
Localização: Niterói - RJ

Pessoal,

acabei resolvendo através da solução indicada pelo João, pois achei mais simples. De qualquer forma, agradeço a todos pela ajuda.

:D
lucasfaria88
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qui, 07 Ago 2008 2:57 pm
Localização: SP
Analista/Programador PL/SQL Pleno

é possível usar o decode no where tambem...

Selecionar tudo

decode(parametro2,0,0,1) = decode(parametro2,0,campo2,1)
and decode(parametro2,0,1,campo2) = decode(parametro2,0,1,campo2)
colocando esse comando na where, funcionaria!


:wink:
Responder
  • Informação