Para exemplificar o uso do CASE em uma consulta SQL, estarei mostrando aqui alguns exemplos que podem ser aplicados à situação a seguir.
Suponha que você tenha uma tabela de pessoas com os campos, cdcliente (código do cliente), cdfornecedor (código do fornecedor) e tppessoa (tipo de pessoa). Onde nesta tabela ou o campo cdcliente ou o campo cdfornecedor estará preenchido (nunca os dois ao mesmo tempo) .
A idéia será fazer um sql que retorne o nome da pessoa dependendo do tipo.
Uma das soluções seria fazer dois left joins nas tabelas de cliente e fornecedor pegando o nome de cada uma delas. No entanto, neste caso a consulta retornaria dois campos, e isto não é desejado.
Para fazer então que a consulta retorne apenas um campo, utilizaremo o CASE.
Veja:
SELECT nome =
CASE tppessoa
WHEN 1 THEN (
SELECT c.nome FROM cliente c WHERE c.cdcliente = p.cdcliente
)
WHEN 2 THEN (
SELECT f.nome FROM fornecedor f
WHERE f.cdfornecedor = p.cdfornecedor
)
ELSE ''
END
FROM pessoa p
Neste exemplo, estamos verificando qual o valor contido no campo tppessoa. Caso for 1, fazemos um select na tabela de cliente buscando o seu nome. E caso for 2 buscamos o nome na tabela de fornecedores. O resultado e armazenado no campo nome, criado na própria consulta. Se nenhuma dos valores (1 ou 2) for verdadeiro o campo irá receber uma string vazia (neste caso).
Outra solução seria:
SELECT nome =
CASE
WHEN cdfornecedor is not null THEN (
SELECT c.nome FROM cliente c WHERE c.cdcliente = p.cdcliente
)
WHEN cdfornecedor is not null THEN (
SELECT c.nome FROM cliente c WHERE c.cdcliente = p.cdcliente
)
END
FROM pessoa p
Neste caso o campo tppessoa nem é necessário contanto que exista na tabela somente o valor de cdcliente ou cdfornecedor, sendo que um dos campos deverá conter valor nulo. Perceba que agora o CASE possui condições distintas, diferente do primeiro exemplo. Utilizando essa mesma idéia poderÃamos fazer um select que retornaria a descrição do tipo de pessoa, por exemplo:
SELECT nmtppessoa =
CASE
WHEN cddependente is not null THEN 'Cliente'
WHEN numatricula is not null THEN 'Fornecedor'
END
FROM pessoa p
O CASE também pode ser usado em uma condição, ou seja dentro do WHERE. Veja um outro exemplo:
SELECT NOME , SALDO , SALDO_POUPANÇA , SALDO_APP , VAL_DEPOSITO
FROM CONTA_CORRENTE
WHERE
(
CASE SALDO
WHEN SALDO < 0 THEN SALDO_POUPANÇA
WHEN SALDO >= 0 THEN SALDO
WHEN SALDO > 10000 THEN SALDO_APP
) > VAL_DEPOSITO
Neste exemplo, a condição sendo verdadeira, o que será retornado será o valor de um dos campos que logo após será verificado se é maior do que VAL_DEPOSITO, finalizando assim o WHERE da consulta principal.
Me ajudou muito rsrsrs
Fala markin…baum d+ fih…seu codigo me quebrando o galho novamente..rsrs..bem util o blog…abracao kra ate+
ajudou bastante. era simples e eu estava me embananando
Muito obrigado irmão. Fiquei foi com uma pequena dúvida. Pegando no 1º exemplo, posso usar esse método para fazer select de duas colunas dessa forma?
Neste caso tem que fazer a primeira coluna e depois repetir o mesmo procedimento pra segunda coluna.