select dentro do case ou if

03/02/2016

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

Respostas

04/02/2016

Din

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 Citar

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 Citar

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 Citar

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 Citar

05/02/2016

Din

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 Citar

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 Citar