select dentro do case ou if

03/02/2016

0

Pessoal não manjo muito de sql e gostaria de uma ajuda para montar uma consulta.
Preciso fazer uma seleção condicional em duas tabelas, por exemplo:

Se em uma tabela eu tiver o campo pfcompl.status = '05' então eu quero selecionar o campo pfcompl.xcodigo
porém se esse campo for diferente de '05' então eu selecionaria o campo pfunc.codigo.

Eu gostaria que fosse um select dentro de um case pq vou utilizar os campos condicionais no where.
Marcelo Manzini

Marcelo Manzini

Responder

Posts

04/02/2016

Claudio Lopes

Marcelo,

Poderia colocar a sua query para analise? Mas tentando te ajudar....

nao seria melhor você colocar um case when em sua consulta tipof

select ....

case 
when pfcompl.status = '05'  then  campo pfunc.codigo

from
.....


lembrando que você também pode usar essa lógica no where, mas por questões de boas práticas, performance... poste o código.
Responder

04/02/2016

Alex Lekao

acho q seria interessante detalhar melhor para tentarmos ajudar melhor.

honestamente nao consegui entender bem.

no sql eh possivel usar um if, onde faz um tratamento de uma variavel e se o resultado for verdadeiro ele executa um select e se for falso ele executa um outro select.

eu utilizo esse if aqui em uma consulta minha por uma questao muito especifica que nao consegui contemplar com o case.
Responder

04/02/2016

Marcelo Manzini

Tentei colocar abaixo mais ou menos o que eu preciso, provavelmente a composição está errada, mas talvez o sentido esteja certo, se der para entender o sentido e indicar as correções talvez eu consiga resolver o problema:

SELECT PFUNC.CHAPA, PFCOMPL.STATUSVAGA
CASE WHEN PFCOMPL.STATUSVAGA ='05' THEN
(SELECT PFCOMPL.YCODSECAO, PFCOMPL.XCODFUNCAO
FROM PFCOMPL
WHERE PFCOMPL.CHAPA = PFUNC.CHAPA)
ELSE
(SELECT PFUNC.CODSECAO, PFUNC.CODFUNCAO
FROM PFUNC
WHERE PFCOMPL.CHAPA = PFUNC.CHAPA)
END
FROM PFUNC, PFCOMPL
WHERE PFUNC.CHAPA = PFCOMPL.CHAPA
Responder

05/02/2016

Alex Lekao

ola, bom dia!!!

esse seu select retornou algum erro?

So uma dica para ajudar nas leituras dos codigos qdo postar utilize a tag inserir codigo(</>).

talvez vc tera que usar algum group by dentro dos selects e tal.
Responder

05/02/2016

Claudio Lopes

Marcelo... sua query está assim
SELECT 
	PFUNC.CHAPA, 
	PFCOMPL.STATUSVAGA
	CASE 
		WHEN PFCOMPL.STATUSVAGA ='05' 
			THEN (SELECT PFCOMPL.YCODSECAO, PFCOMPL.XCODFUNCAO FROM PFCOMPL WHERE PFCOMPL.CHAPA = PFUNC.CHAPA)
		ELSE
			(SELECT PFUNC.CODSECAO, PFUNC.CODFUNCAO FROM PFUNC WHERE PFCOMPL.CHAPA = PFUNC.CHAPA )
	END
FROM 
	PFUNC, PFCOMPL
WHERE 
	PFUNC.CHAPA = PFCOMPL.CHAPA 


Voce está utilizando sub query's porém essa sub query tem que retornar 1 linha e 1 coluna. Caso tentasse executa-la iria dar erro como esse
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.


Montando sua query eu faria assim:

SELECT 
	PFUNC.CHAPA, 
	PFCOMPL.STATUSVAGA,
	-- EXEMPLO COM IIF
	IIF(PFCOMPL.STATUSVAGA = '05', PFCOMPL.YCODSECAO,PFUNC.CODSECAO) AS 'CODSECAO'
	-- EXEMPO COM CASE
	CASE 
		WHEN PFCOMPL.STATUSVAGA = '05' 
			THEN PFCOMPL.XCODFUNCAO
		ELSE
			PFUNC.CODFUNCAO
	END AS 'CODFUNCAO'
FROM 
	PFUNC WITH(NOLOCK), PFCOMPL WITH(NOLOCK)
WHERE 
	PFUNC.CHAPA = PFCOMPL.CHAPA 


Qualquer dúvida posta ai
Responder

19/02/2016

Helder

Olá pessoal, tudo bem?
Não sei se já conhecem, mas existe uma plataforma para criação de webservices muito eficiente, basta apenas liberar acesso para o banco de dados, e você pode criar uma nova tabela, um novo campo com apenas um clique, talvez ajude muito vocês.
Fica a indicação do Datasocket.
datasocket.co/free
Responder

18/03/2021

Jacqueline

Olá pessoal, sou nova por aqui preciso saber se é possível fazer um select join dentro de um case se for por favor me informe onde esta o erro senão o que pode ser feito, segue o comando que preciso executar:

select m.ArquivoOrdemMov,m.ContadorAgenteMov,m.DataMov,m.SeqOrdemMov,m.SeqProduto,m.SaldoTotalMov,p.DescricaoProduto
,case when m.ArquivoOrdemMov=''OC''then ''Preço''
/*(select ci.CustoOCItem from OCItem ci join OC c on c.SeqOC=ci.SeqOC)* -> e não sei se esta certo/
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''
Responder

18/03/2021

Emerson Nascimento

do que exatamente você precisa?
porque o erro não está na select. está na própria case.
select
	m.ArquivoOrdemMov,
	m.ContadorAgenteMov,
	m.DataMov,
	m.SeqOrdemMov,
	m.SeqProduto,
	m.SaldoTotalMov,
	p.DescricaoProduto,
	case	when m.ArquivoOrdemMov='OC'
			then 'Preço'
			else (select ci.CustoOCItem from OCItem ci where ci.SeqOC = c.SeqOC) -- a relação é somente por um campo?
	end
	-- os resultados do THEN e do ELSE precisam ser do mesmo tipo
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'


sugestão:
select
	m.ArquivoOrdemMov,
	m.ContadorAgenteMov,
	m.DataMov,
	m.SeqOrdemMov,
	m.SeqProduto,
	m.SaldoTotalMov,
	p.DescricaoProduto,
	case	when m.ArquivoOrdemMov='OC'
			then 'Preço'
			else ci.CustoOCItem
	end
	/* os resultados do THEN e do ELSE precisam ser do mesmo tipo */
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
left join
	OCItem ci on ci.SeqOC = c.SeqOC -- não falta mais algum campo pra relacionar?
where
	m.ArquivoOrdemMov='OC'
	and c.SituacaoOC='FECHADA'

Responder

20/08/2021

Jacqueline

Olá Pessoal,

Agradeço a ajuda, mas vi que a minha dúvida não se tratava somente disso, como ia precisar fazer 2 union's precisei fazer mais algumas coisas, segue o que foi feito e deu certo para que resolvesse o meu problema, segue o que fiz:

select 
m.ArquivoOrdemMov as Movimento,
m.ContadorAgenteMov as Contador,
m.DataMov as Data_da_Movimentacao,
p.CodigoProduto as Codigo,
p.DescricaoProduto as Descricao,
m.QtdOperacaoFisicaMov as Quantidade,
FORMAT (ci.CustoOCItem,'0.000') as Preco_Compra,/*o problema era a partir daqui, como tinha mais 2 tabelas sem ter o preço tive que usar o format nessas 3 colunas*/
FORMAT (ep.ValorCustoEstoquePro,'0.000') as Preco_Custo,
FORMAT (ep.ValorCompraEstoquePro,'0.000') as Preco_Cadastrado
,te.DescricaoTbEstoque as Estoque
from Mov m
join MovFisica f on m.SeqMovFisica=f.SeqMovFisica
join Produto p on m.SeqProduto=p.SeqProduto
join OC c on m.ContadorAgenteMov=c.ContadorAgenteOC
join OCItem ci on (m.SeqProduto=ci.SeqProduto and m.SeqOrdemItemMov=ci.SeqOCItem)
join EstoquePro ep on (m.SeqTbEstoque=ep.SeqTbEstoque and m.SeqProduto=ep.SeqProduto)
join TbEstoque te on m.SeqTbEstoque=te.SeqTbEstoque
where m.ArquivoOrdemMov='OC' and c.SituacaoOC='FECHADA' 

Responder

20/08/2021

Jacqueline

Retificando era mais 2 colunas e não tabela como postei no comentários,
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar