Usar CASE 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 tentando usar o case dentro de uma clausula where, a lógica é simples mas não acerto fazer, dá erro de SQL terminado inesperadamente na linha 17 e não consegui encontrar a solução:

Selecionar tudo

SELECT DATA,
                   COD_REPRE             ,
                   NOME_REPRE            ,
                   COD_ACA               ,
                   DES_ACA               ,
                   QTDE_CX_PREVISTO      ,
                   VLR_PREVISTO          ,
                   QTDE_CX_VENDIDO       ,
                   VLR_VENDIDO           ,
                   QTDE_CX_FATURADO      ,
                   VLR_FATURADO          ,
                   VLR_FATURADO_LIQ      ,
                   PERC_CX_PREV_X_FATUR  ,
                   PERC_VLR_PREV_X_FATUR
        FROM  V_COTA_REPRE_PROD
     WHERE  DATA      BETWEEN :V_DATA_INI AND :V_DATA_FIM               
          CASE :WEB_COD_REP WHEN IS NOT NULL THEN 
            AND COD_REPRE  = :WEB_COD_REP      
          ELSE
            CASE :COD_SUP_WEB IS NOT NULL THEN
              AND COD_REPRE IN(select r.cod_repre
                               from supervisores s, representantes r, login_web l
                               where l.codigo    = s.func_cod_func
                               and s.cod_sup   = r.regiao_cod_reg
                               and l.codigo    = :COD_SUP_WEB)
            END
          END          
          AND DATA IS NOT NULL
ORDER BY COD_ACA, DATA
Alguém sabe me informar se a construção acima está correta?
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Dá uma pesquisada aqui no fórum, por Case .
Vai encontrar tópicos que podem ajudá-lo.
qualquer coisa, manda ai.
Editado pela última vez por Trevisolli em Qui, 24 Mai 2007 8:16 am, em um total de 2 vezes.
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Cara na boua, esse link que você passou remete para este mesmo topico que eu abri.
Já pesquisei no fórum e não encontrei nada do genero (case na clausula where).
Vlw.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

O Trevisolli deve ter se enganado.
Veja esse link: http://glufke.net/oracle/viewtopic.php?t=12

O certo é CASE WHEN. Veja esse exemplo acima! :-o
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Verdade, já eliminei o link, Dr_gori (Valeu).
Outra coisa, CASE na cláusula Where, eu nunca vi não.
Se alguém souber de algo, manda ai.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Eu mandei o link ali no POST de cima...
Existe sim, é CASE WHEN.
É muito bom !
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 achei uma solução usando union pois com case não ia rolar pois eu precisaria utilizar uma subselect.
Mas case na clausula where funciona sim.
amorroni
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Qua, 30 Mai 2007 6:28 pm
Localização: SP

Alguém tem um exemplo prático utiliza :?: ndo CASE na cláusula WHERE ???[/b]
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Normalmente se usa CASE WHEN quando é muito complicado fazer a condição usando DECODE, ou outras funções.
Veja abaixo:

Selecionar tudo

select
  campo1
, campo2
, case
    when taxa>0 and valor>=100 and valor <1000 then salario*2
    when taxa=  and valor>=1000 then salario*1.5
    when valor < 100 then salario *3
  end novo_valor
from tabela
Tente fazer isso sem o case when :-D
No link citado anteriormente, tem um exemplo bem simples usando CaseWhen e a mesma coisa não usando..Veja que é bem complicado de fazer e pouco "entendível"..
:-o
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

CASE na cláusula WHERE??....como?...eu nunca vi...coloca aí para eu ver!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

O Case que eu falo não é na CLAUSULA WHERE. Não faz sentido usar case na cláusula where!
erthal
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 130
Registrado em: Seg, 22 Nov 2004 1:45 pm
Localização: Niterói - RJ
Gustavo Erthal Jr. | TRISCAL
...................................................
Rio de Janeiro | (21) 2507-2010
São Paulo | (11) 3167-0526
www.triscal.com.br

Senhores,

Para utilizar um CASE na cláusula WHERE é muito simples, vocês precisam de uma igualdade para funcionar, por exemplo

Selecionar tudo

SELECT ....
FROM ...
WHERE 1 = CASE A = B THEN 1 ELSE = END
Resolvida a questão. E eu já vi e muito sobre a utilização desse recurso na cláusula WHERE, pois tudo depende do modelo.

Abraços
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

galera, pegando um tópico antigo aqui


não consegui entender essa lógica do erthal

eu preciso fazer isso:

Selecionar tudo

DEFINE var1 = 'G' ou 'S';


SELECT georgset.orgs_ds || DECODE(georgset.orgs_dt_final,NULL,' (Ativo)',' (Inativo)') Label,
       georgset.orgs_cd Value
  FROM georgset, rhexpencar 
 WHERE georgset.orgs_cd = rhexpencar.orgs_cd
   AND georgset.empr_cd = '01'
   AND rhexpencar.func_cd = '006112'
      
   AND georgset.orgs_dt_final IS NULL;            

 ORDER BY 1
onde se var1 = 'G' a comparação deva ser:

Selecionar tudo

AND georgset.orgs_dt_final IS NOT NULL
e se var1 = 'S':

Selecionar tudo

AND georgset.orgs_dt_final IS NULL

dá pra fazer isso com o CASE na cláusula Where ou de outra forma?
Avatar do usuário
mic_mota
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qua, 12 Mar 2008 4:29 pm
Localização: São Bernardo do Campo-SP
Abraço,

Michelle Mota

Eu pensei em algo assim (não testei) :roll:

Selecionar tudo

DEFINE var1 = 'G' ou 'S'; 

SELECT georgset.orgs_ds || DECODE(georgset.orgs_dt_final,NULL,' (Ativo)',' (Inativo)') Label, 
       georgset.orgs_cd Value 
  FROM georgset, rhexpencar 
 WHERE georgset.orgs_cd = rhexpencar.orgs_cd 
   AND georgset.empr_cd = '01' 
   AND rhexpencar.func_cd = '006112' 
      
   AND ((georgset.orgs_dt_final IS NULL and var1 = 'S') or 
            (georgset.orgs_dt_final IS NOT NULL and var1 = 'G'));            

 ORDER BY 1 


Abrazzz
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

humm, boa alternativa, pode ser, ! :idea:

valeu pela dica
jeanferreira
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qua, 30 Abr 2008 3:10 pm
Localização: São Paulo - SP
Na vida devemos fazer três coisas, estudar, estudar e estudar !!!

8) Olá galera, realmente funciona o Case When na clausula where, segue abaixo um exemplo de como implementei na empresa que trabalho:

Selecionar tudo

Select * from <NOME_TABELA>
where EMIS_IND_ENDOSSO = 204
   and emis_num_endosso = CASE WHEN 1 <> -1 THEN '2' ELSE EMIS_NUM_ENDOSSO END
   and EMIS_EMPRESA = 1
   and EMIS_RAMO_ITEM = CASE WHEN 1 <> -1 THEN 18 ELSE EMIS_RAMO_ITEM END
   and emis_num_apolice = '1085004466401'
este é um exemplo prático de que realmente funciona, mas pelos meus testes só funciona com comparação, ou seja, <Campo> = Case .....

[]'s
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

nossa, mais do que anotado! hehe

valeu por todas as dicas aí

realmente, depois de 3 anos trampando na área, eu continuo achando SQL uma coisa muito fo*a! :o
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

no bom sentido
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola, boa noite... Estou apanhando aqui igual filho sem pai, preciso fazer um CASE, sem select, exemplo:

Selecionar tudo

  CASE
    WHEN :APP_PAGE_ID = 101
      THEN '7'
    WHEN :APP_PAGE_ID = 102
      THEN '999'
    ELSE '0'
  END case;
Estou criando um ITEM DE APLICACAO, então o resultado irá carregar o item

alguém poderia me ajudar? agradeço
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Olá,

não entendi o problema.
Dentro do PLSQL tu queres fazer essas alterações?

Deves usar "IF ..... THEN... ELSE... ". No caso.

Qualquer coisa, qual o erro que dá?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Acho que ele quer fazer um IF, ELSIF, ELSIF, ELSIF...

assim:

Selecionar tudo

    IF sales > 50000 THEN
      bonus := 1500;
    ELSIF sales > 35000 THEN
      bonus := 500;
    ELSE
      bonus := 100;
    END IF;
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola, sim, eu utilizei o CASE no exemplo assim, pois foi os testes q fiz, porem não deram certos... mas pode ser IF mesmo, eu so quero é fazer com q dependendo da pagina carregada o ITEM DA APLICAÇÃO seja carregada com um determinado codigo... eu já terei as paginas definidas e pra cada pagina um codigo pro item de aplicacao... tipo:

Selecionar tudo

IF PAGINA = 101 THEN
  '7'
ELSE
IF PAGINA = 102 THEN
  '8'
ELSE
IF PAGINA = 103 THEN
  '9'
ELSE
IF PAGINA = 104 THEN
  '10'
ELSE
'0'
END IF
quero testar quantas paginas eu precisar
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola, desculpe, não tinha visto a segunda pagina... a dica do DR_GORI deu certo, era o q eu precisava... problema resolvi.. muito obrigado a todos
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

Dá pra usar case when sim, desta forma, não sei se atende.

Selecionar tudo

 
Variavel := CASE
    WHEN :APP_PAGE_ID = 101
      THEN '7'
    WHEN :APP_PAGE_ID = 102
      THEN '999'
    ELSE '0'
  END;
Responder
  • Informação
  • Quem está online

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