Ir para conteúdo
ronimarcos.silva

Usar Case com IN e NOT IN no Oracle

Recommended Posts

Como faço para usar o Case com o "In", por exemplo no caso abaixo?

(case gope.cd_grp_operat
	when 1 then 1
	when 3 then 1
	when 15 then 1
 	when 25 then 1
 	when 35 then 1
 	when 45 then 1
 	when 55 then 1
	else 99
end ) ib_controla_km,

-- Eu posso fazer asism?

(case gope.cd_grp_operat
	when in (1, 3, 15, 25, 35, 45, 55)
	else 99
end ) ib_controla_km,

Ou assim, aninhando o (1, 3, 45) dentro de um "IN": 

 

                  (case gope.cd_grp_operat            
                        when gope.cd_grp_operat = 1 then 
                  (Select Vl_hori_odom
      From Apabastec_De
     Where Apabastec_De.Id_Equipto = eq.id_equipto
       And Dt_Abastec = (Select Max(Dt_Abastec)
                           From Apabastec_De
                          Where ID_Equipto = eq.id_equipto)
                          )
                       when 2 then 
                  (Select Vl_hori_odom
      From Apabastec_De
     Where Apabastec_De.Id_Equipto = eq.id_equipto
       And Dt_Abastec = (Select Max(Dt_Abastec)
                           From Apabastec_De
                          Where ID_Equipto = eq.id_equipto)
                        )  
                       when 45 then 
                  (Select Vl_hori_odom
      From Apabastec_De
     Where Apabastec_De.Id_Equipto = eq.id_equipto
       And Dt_Abastec = (Select Max(Dt_Abastec)
                           From Apabastec_De
                          Where ID_Equipto = eq.id_equipto)
                        )else 0    
                           end)f_km_inicial, 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

A síntaxe do case no sql é algo como

 

(Case when gope.cd_grp_operat in (1,2,3,7) then 'S' else 'N' end) operacoes_xpto,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se tenho que abrir outro tópico, mas veja o que ocorre:

 

No meu query, se coloco um campo assim ele funciona normalmente:

				  (case when gope.cd_grp_operat in (1, 3, 45)
                        then 
                     (Select Vl_hori_odom
                        From Apabastec_De
                       Where Apabastec_De.Id_Equipto = eq.id_equipto
                         And Dt_Abastec = (Select Max(Dt_Abastec)
                                             From Apabastec_De
                                            Where ID_Equipto = eq.id_equipto)
                      ) else 0 end)f_km_inicial

Mas se coloco o outro campo, dá o erro: ORA-01427: a subconsulta de uma única linha retorna mais de uma linha:

				  (case when gope.cd_grp_operat in (1, 3, 45)
                        then 
                     (Select Vl_hori_odom
                        From Apabastec_De
                       Where Apabastec_De.Id_Equipto = eq.id_equipto
                         And Dt_Abastec = (Select Max(Dt_Abastec)
                                             From Apabastec_De
                                            Where ID_Equipto = eq.id_equipto)
                      ) else 0 end)f_km_inicial, --38

                  (case when gope.cd_grp_operat not in (1, 3, 45)
                        then 
                     (Select Vl_hori_odom
                        From Apabastec_De
                       Where Apabastec_De.Id_Equipto = eq.id_equipto
                         And Dt_Abastec = (Select Max(Dt_Abastec)
                                             From Apabastec_De
                                            Where ID_Equipto = eq.id_equipto)
                      ) else 0 end) f_horimetro_inicial --39

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

ORA-01427: a subconsulta de uma única linha retorna mais de uma linha

 

Quando se usa subselect como coluna este só pode retornar no máximo uma linha

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por jackvinte
      Olá, sou nova por aqui.
       
      É possível fazer um select join dentro de um case, segue o que preciso:
       
      select m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov,p.DescricaoProduto --,case when m.ArquivoOrdemMov='OC'then 'Preço' /*dentro do then preciso pegar o preço ->select ci.CustoOCItem from OCItem ci join OC c on c.SeqOC=ci.SeqOC*/ --else 'Sem valor'end from Mov m join MovFisica f on m.SeqMovFisica=f.SeqMovFisica join OC c on m.ContadorAgenteMov=c.ContadorAgenteOC join Produto p on m.SeqProduto=p.SeqProduto where m.ArquivoOrdemMov='OC' and c.SituacaoOC='FECHADA'  
    • Por SAS Junior
      Olá, sou novo aqui e em SQL Server, estou com um problema para buscar um resultado. 
      Caso hoje seja segunda, trazer as instalações dos últimos 3 dias (sexta, sábado e domingo), caso não seja, trazer só os de ontem, tentei da forma abaixo e muitas outras e não consegui, desde já agradeço.    
      SELECT codigoCliente AS [CÓD], CpfCnpj AS [CPF/CNPJ] ,NomeFantasia as [NOME FANTASIA] ,UPPER(NomeContato) as [NOME DE CONTATO] ,CASE WHEN CLI.DDDCelular IS NULL THEN 'NÃO TEM' ELSE DDDCelular END AS [DDD CEL] ,CASE WHEN Celular IS NULL THEN 'NÃO TEM' ELSE Celular END AS CELULAR ,CASE WHEN DDDTelefone IS NULL THEN 'NÃO TEM' ELSE DDDTelefone END AS [DDD TEL] ,CASE WHEN Telefone IS NULL THEN 'NÃO TEM' ELSE Telefone END AS TELEFONE ,DataInstalacao AS [INSTALAÇÃO] ,DATEPART(weekday,DataInstalacao) as [DIASEMANA] ,UPPER(Departamento) AS [DEPTO CAD] ,upper(UsuarioCadastro) as [CADASTRADO POR] ,CASE WHEN UPPER(EMAIL) IS NULL THEN 'NÃO TEM EMAIL' ELSE UPPER(EMAIL) END AS EMAIL FROM CLIENTE WHERE (CASE WHEN (DATEPART(weekday,GETDATE()) = '2' THEN DATEPART(DAY, DataInstalacao) >= DATEPART(DAY, GETDATE()-3) ELSE DATEPART(DAY, DataInstalacao) = DATEPART(DAY, GETDATE()-1) END) AND MONTH(DataInstalacao) = MONTH(GETDATE()) AND YEAR(DataInstalacao) = YEAR(GETDATE()) AND Situacao = 'MAQUINA INSTALADA'  
    • Por Luiz Henrique
      Tenho uma consulta entre várias tabelas, e 2 das clausulas é soma. Essa funciona SUM(t3.valor_servico*t3.quantidade)... Com essa junta não. SUM(CASE WHEN tab1.codigo = tab2.codigo THEN tab2.valor END) AS valor_pago Tentei fazer igual a de cima mas não rolou, então li a respeito do CASE, e tentei isso acima.
       
      Ocorre que o sistema tem opção de efetuar vários pagamentos em datas diferentes até que o valor total seja quitado.
      No caso, tenho uma tabela para armazenar o valor pago(valor), quem pagou (codigo) entre outras coisas, denominada como tab2 e a tab1 com outras informações, e o codigo.
       
      Não sei se é possível, mas estou precisando que esses 2 SUM estejam na mesma consulta porque fiz a condição acima sozinha para teste e funciona, então não faço ideia do que ocorre.
       
      o sql inteiro é esse, e preciso somar a  quantidade paga de cada ticket.
       
      $sql = mysqli_query($conexao, "SELECT *, SUM(st.valor_servico*st.quantidade) AS soma_servico FROM ticket t JOIN clientes c ON t.id_cliente = c.id_cliente JOIN servico_ticket st ON t.id_ticket = st.id_ticket JOIN status sts ON sts.id_status = t.status JOIN usuarios us ON us.id_user = t.atendente JOIN pagamento_ticket pgt WHERE t.id_loja ".$condLoja." AND ".$acao_status." GROUP BY t.id_ticket")or die (mysqli_error()); Obrigado.
       
    • Por igor.js167
      Boa tarde,
       
      No banco de dados tenho as informações a seguir, em diferentes tabelas: Acesso,  Dose prescrita, tempo e volume. Preciso, de acordo com essas informações, calcular dois valores chamados bolus e rate seguindo uma condicional. O problema é como vou retornar estes dois valores, se não tem atributo onde eu possa inseri-los?
       
      Eu deveria criar uma nova tabela pra eles? Existe como retornar estes atributos sem ter de mexer em nenhuma tabela?
      O código atual que tenho, é:
      select a.nr_atendimento ATENDIMENTO, obter_nome_pf_atend(a.nr_atendimento) NOME, obter_data_nascto_pac_atend(a.nr_atendimento) NASCIMENTO, 'DOSE: ' || decode(a.qt_dose,',5','2.500 UI','1','5.000 UI','1,5','7.500 UI','2','10.000 UI','2,5','12.500 UI','3','15.000 UI','3,5','17.500 UI', '4','20.000 UI','4,5','22.500 UI','5','25.000 UI','5,5','27.500 UI','6','30.000 UI') DOSE, 'VOLUME: ' || a.qt_volume || ' ml' VOLUME, obter_desc_material(a.cd_material) MEDICAMENTO, d.qt_hora_min_sessao TEMPO, e.nr_seq_tecnica ACESSO -- Inserir aqui condicionais para cálculo de BOLUS e RATE from CPOE_material a, atend_paciente_unidade b, hd_escala_dialise c, cpoe_dialise d, hd_acesso e where a.cd_material = 49749 and a.nr_atendimento = b.nr_atendimento and d.nr_atendimento = b.nr_atendimento and obter_cd_pes_fis_atend(b.nr_atendimento) = c.cd_pessoa_fisica and b.dt_saida_unidade is null and a.dt_liberacao is not null and a.dt_suspensao is null and d.dt_liberacao is not null and d.dt_suspensao is null and c.dt_fim is null and e.cd_pessoa_fisica = obter_pessoa_atendimento(b.nr_atendimento,'C') and e.ie_adequado = 'S' and e.dt_perda_retirada is null and c.nr_seq_turno = :turno and c.nr_seq_escala = :escala E as condicionais que quero inserir é mais ou menos assim:
      SE acesso arteriovenoso então: se dose_prescrita = 2500 então bolus = volume e rate = '-' se dose_prescrita = 5000 então: se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-' se tempo = 3:00h ou 3:05 então Bolus = 6,0 e rate = 1,6 se tempo = 3:30h ou 3:35 então Bolus = 6,0 e rate = 1,3 se tempo = 4:00 ou 4:05h então bolus = 6,0 e rate = 1,1 se dose_prescrita = 7500 então se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-' se tempo = 3:00h ou 3:05 então Bolus = 8,0 e rate = 2,8 se tempo = 3:30h ou 3:35 então Bolus = 8,0 e rate = 2,3 se tempo = 4:00 ou 4:05h então bolus = 8,0 e rate = 2,0 se dose_prescrita = 10000 então se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-' se tempo = 3:00h ou 3:05 então Bolus = 10,0 e rate = 4,0 se tempo = 3:30h ou 3:35 então Bolus = 10,0 e rate = 3,3 se tempo = 4:00 ou 4:05h então bolus = 10,0 e rate = 2,9 se dose_prescrita = 12500 então se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-' se tempo = 3:00h ou 3:05 então Bolus = 11,0 e rate = 5,6 se tempo = 3:30h ou 3:35 então Bolus = 11,0 e rate = 4,7 se tempo = 4:00 ou 4:05h então bolus = 11,0 e rate = 4,0 se dose_prescrita = 15000 então se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-' se tempo = 3:00h ou 3:05 então Bolus = 13,0 e rate = 6,8 se tempo = 3:30h ou 3:35 então Bolus = 13,0 e rate = 5,7 se tempo = 4:00 ou 4:05h então bolus = 13,0 e rate = 4,9 se dose_prescrita = 30000 então se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-' se tempo = 3:00h ou 3:05 então Bolus = 23,0 e rate = 14,8 se tempo = 3:30h ou 3:35 então Bolus = 23,0 e rate = 12,3 se tempo = 4:00 ou 4:05h então bolus = 23,0 e rate = 10,6 se não então null SE acesso cateter então: se dose_prescrita = 2500 então bolus = volume e rate = '-' se dose_prescrita = 5000 então: se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-' se tempo = 3:00h ou 3:05 então Bolus = 6,0 e rate = 1,3 se tempo = 3:30h ou 3:35 então Bolus = 6,0 e rate = 1,1 se tempo = 4:00 ou 4:05h então bolus = 6,0 e rate = 1,0 se dose_prescrita = 7500 então se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-' se tempo = 3:00h ou 3:05 então Bolus = 8,0 e rate = 2,3 se tempo = 3:30h ou 3:35 então Bolus = 8,0 e rate = 2,0 se tempo = 4:00 ou 4:05h então bolus = 8,0 e rate = 1,8 se dose_prescrita = 10000 então se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-' se tempo = 3:00h ou 3:05 então Bolus = 10,0 e rate = 3,3 se tempo = 3:30h ou 3:35 então Bolus = 10,0 e rate = 2,9 se tempo = 4:00 ou 4:05h então bolus = 10,0 e rate = 2,5 se dose_prescrita = 12500 então se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-' se tempo = 3:00h ou 3:05 então Bolus = 11,0 e rate = 4,7 se tempo = 3:30h ou 3:35 então Bolus = 11,0 e rate = 4,0 se tempo = 4:00 ou 4:05h então bolus = 11,0 e rate = 3,5 se dose_prescrita = 15000 então se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-' se tempo = 3:00h ou 3:05 então Bolus = 13,0 e rate = 5,7 se tempo = 3:30h ou 3:35 então Bolus = 13,0 e rate = 4,9 se tempo = 4:00 ou 4:05h então bolus = 13,0 e rate = 4,3 se dose_prescrita = 30000 então se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-' se tempo = 3:00h ou 3:05 então Bolus = 23,0 e rate = 12,3 se tempo = 3:30h ou 3:35 então Bolus = 23,0 e rate = 10,6 se tempo = 4:00 ou 4:05h então bolus = 23,0 e rate = 9,3 Atenciosamente,
      Igor
       
    • Por Mfenoglio
      Galera boa tarde, estou com o seguinte problema.
      Eu quero fazer uma conta entre duas tabelas se for PAGO ou RECEBIDO.
      Minha query

       
      SELECT F10_CODBANCO, F10_VALOR, F0S5_RECPAG, SUM(S05_VALOR) AS SVALMOV, G27_N35OMEBAN5CO FROM F10, F05, G27 WHERE FS10_GRUPO = F05_GRUPO AND F10_EMPESA = F0X5_EMPRESA AND F_FILIAL d= F05_FILIAL AND Fa10_CGODBANCO = F05_BANCO AXND F10_GRUPO = G27_G AND F1MPARESA = G27_EAMPRESDA AND F10_FILIAL = G27_FILIAL AND F10_CODBANCO = G27_CODIGO AND FZ10_VALOR <> 0 GROUAP BYA F10_CODCBANCO, FA10_VALOR, F05_RECGHPAG, G27_NHOMEBANAO AORDER BY F10D_CODANCFO  
      o que eu quero é o seguinte, Se F05_RECPAG for igual a P então faça F10_VALOR - SUM(F05_VALOR) AS VALMOV .... agora se for igual a R faça F10_VALOR + SUM(F05_VALOR) AS VALMOV.
       
      Agradeço quem puder me ajudar. vlw
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.