Utilizando a cláusula CASE em um select no SQL Server

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

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

Related Posts Plugin for WordPress, Blogger...
Esta entrada foi publicada em Banco de Dados, SQL Server e marcada com a tag , . Adicione o link permanente aos seus favoritos.

13 respostas a Utilizando a cláusula CASE em um select no SQL Server

  1. Paulo disse:

    Me ajudou muito rsrsrs

  2. Julio disse:

    Fala markin…baum d+ fih…seu codigo me quebrando o galho novamente..rsrs..bem util o blog…abracao kra ate+

  3. ajudou bastante. era simples e eu estava me embananando

  4. Nuno disse:

    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?

  5. Edmilson disse:

    Muito bom, me ajudo muito, só que estou com uma dificuldade e gostaria de saber alguém pode me ajudar.
    Montei esse select abaixo, mas, não esta retornando nenhum resultado, espero que alguém possa me ajuda.

    Select tbfc.NU_EMPRESA, tbem.NO_EMPRESA, tbfc.DT_FLUXO_CAIXA, tbfc.HH_FLUXO_CAIXA,
    tbfc.NU_CAIXA, tbfc.IC_FLUXO_CAIXA, tbfc.ID_FLUXO_CAIXA,
    tbfc.CO_DOCTO_SIST_RELAC, tbfc.VR_ENTRADA_CAIXA, tbfc.VR_SAIDA_CAIXA,
    tbfc.VR_SALDO_CAIXA, tbfc.DE_OBSERVACAO, tbfc.IC_SANGRAVEL, tbfc.IC_SANGRADO,
    tbfc.HH_FLUXO_CAIXA_SANG, tbfc.IC_FLUXO_CAIXA_SANG, tbfc.ID_FLUXO_CAIXA_SANG,
    tbfc.NU_USUARIO, tbu.NO_USUARIO, tbfc.TS_ALTERACAO
    From tb_fluxo_caixa tbfc
    Left Join tb_empresa tbem on
    tbem.NU_EMPRESA = tbfc.NU_EMPRESA
    Left Join tb_usuario tbu on
    tbu.NU_USUARIO = tbfc.NU_USUARIO
    and
    (select case ic_fluxo_caixa
    when “0″ then “Dinheiro”
    when “1″ then “Dinheiro”
    when “B” then “Dinheiro”
    when “Z” then “Dinhiero”
    when “2″ then “Cheque”
    when “3″ then “Cheque”
    when “4″ then “Cartão”
    when “5″ then “Cartão”
    when “9″ then “Vale”
    when “A” then “Bonificação”
    when “B” then “Troco”
    when “Y” then “Outros”
    when “C” then “Pagamento Posterior”
    when “E” then “Boleto”
    when “6″ then “Financiado”
    when “7″ then “Desconto”
    when “8″ then “Sangrias”
    end as ic_tipo_fluxo from tb_fluxo_caixa
    where ic_fluxo_caixa = “2″)
    WHERE tbfc.HH_FLUXO_CAIXA = ’15:02:45′

  6. renato disse:

    Não consegui fazer funcionar no sql server 2008 este 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

  7. Pedro Henrique disse:

    Ajudou e muito… muito Obrigado.

  8. Fernando disse:

    Parabéns pelo post

  9. Camila disse:

    Marcus,

    Preciso fazer um select que, dependendo de um campo de entrada, inclui uma nova condição no Where:

    Exemplo:
    Select *
    from cliente
    where id_us = 2
    and case = wk-cidade 0
    then id_cidade = :wk-cidade
    end

    É possível colocar uma nova claúsula no where dessa forma? Da forma como está acima eu já tentei mas não funcionou.

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>