select dentro do case ou if

03/02/2016

148

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.
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
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
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

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar