Array
(
)

select dentro do case ou if

Marcelo Manzini
   - 03 fev 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.

Din
|
MVP
Pontos: 45
    04 fev 2016

Marcelo,

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

nao seria melhor você colocar um case when em sua consulta tipof
#Código


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.

Alex Lekao
   - 04 fev 2016

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.

Marcelo Manzini
   - 04 fev 2016

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

Alex Lekao
   - 05 fev 2016

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.

Din
|
MVP
Pontos: 45
    05 fev 2016

Marcelo... sua query está assim
#Código

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
Citação:
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.


Montando sua query eu faria assim:

#Código
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

Helder
   - 19 fev 2016

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