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:

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:

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:

O CASE também pode ser usado em uma condição, ou seja dentro do WHERE. Veja um outro exemplo:

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

    Me ajudou muito rsrsrs

  • Julio

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

  • http://www.fatecpg.com.br Vandré Felipe de Oliveira Nicolau

    ajudou bastante. era simples e eu estava me embananando

  • Nuno

    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?

    • Marcus Siqueira

      Neste caso tem que fazer a primeira coluna e depois repetir o mesmo procedimento pra segunda coluna.

  • Anonimo

    Parabéns.

  • Edmilson

    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′

  • http://denisbenjamim.blogspot.com Denis

    Parabens otimo post

  • renato

    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

  • Pedro Henrique

    Ajudou e muito… muito Obrigado.

  • Fernando

    Parabéns pelo post

    • Marcus Siqueira

      Vlw.

  • Camila

    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.