Translate

quarta-feira, 30 de outubro de 2013

Postgresql - Exemplo CASE WHEN

Case é uma expressão condicional, similar a if/else em outras linguagens de programação.
Abaixo serão descritos 3 exemplos da utilização do case em consultas.

No final do artigo, segue os links com um exemplo "bônus", de como utilizar o "CASE WHEN ANINHADO", ou seja, um "CASE WHEN" dentro de outro "CASE WHEN", caso seja necessário avaliar mais de uma condição.

1º Exemplo

Cenário: Serão distribuídos uniformes para times de futebol, de acordo com a seguinte regra:

  • O time "A" receberá uniforme da cor "Amarela";
  • O time "B" receberá uniforme da cor "Azul";
  • O time "C" receberá uniforme da cor "Vermelha";
Podemos ver a imagem da tabela "time_futebol":


Para aplicar esta regra, executamos a sentença abaixo: 

SELECT
time,
CASE
WHEN time = 'A' THEN 'Amarela'
WHEN time = 'B' THEN 'Azul'
WHEN time = 'C' THEN 'Vermelha'
END
AS cor_uniforme
FROM time_futebol;

Após a execução poderemos ver o resultado da distribuição das cores dos uniformes na imagem abaixo:

Significado

SELECT
time,
/*Inicie a condição com CASE*/
CASE                                                   
/*Quando o time for o A então receberá uniforme da cor Amarela*/
WHEN time = 'A' THEN 'Amarela'
/*Quando o time for o B então receberá uniforme da cor Azul*/
WHEN time = 'B' THEN 'Azul'
/*Quando o time for o C então receberá uniforme da cor Vermelha*/
WHEN time = 'C' THEN 'Vermelha'
/*Termine a condição com END*/
END                                                      
/*após os "AS" colocamos o nome da nova coluna que será exibida, ou seja cor_uniforme*/
AS cor_uniforme
FROM time_futebol;

Observações
  • Inicie a condição com CASE;
  • coloque WHEN para iniciar uma condição;
  • após o THEN colocamos o resultado da condição se ela for verdadeira;
  • coloque END para finalizar a condicão;
  • após o AS colocaremos o nome da nova coluna que será exibida;
2º Exemplo

Cenário: queremos classificar o desempenho de cada aluno de acordo com a sua nota. Utilizaremos a seguinte regra:
  • se a nota for maior ou igual a  8.0 é ótimo;
  • se a nota for maior ou igual a  6.0 é bom;
  • se a nota for maior ou igual a  4.0 é regular;
  • se a nota for maior ou igual a  2.0 é ruim;
  • senão será péssimo
Podemos ver a imagem da tabela "tb_nota":


Para aplicar esta regra, executamos a sentença abaixo:

SELECT
aluno,
nota,
CASE
WHEN nota >= 8.0 THEN 'ótimo'
WHEN nota >= 6.0 THEN 'bom'
WHEN nota >= 4.0 THEN 'regular'
WHEN nota >= 2.0 THEN 'ruim'
ELSE 'péssimo'
END
AS desempenho
FROM tb_nota;

Após a execução poderemos ver o resultado do desempenho na imagem abaixo:

Significado:

SELECT
aluno,
nota,
/*Inicie a condição com CASE*/
CASE
/*se a nota for maior ou igual a  8.0 o desempenho é ótimo*/
WHEN nota >= 8.0 THEN 'ótimo'
/*se a nota for maior ou igual a  6.0 o desempenho é bom*/
WHEN nota >= 6.0 THEN 'bom'
/*se a nota for maior ou igual a  4.0 o desempenho é regular*/
WHEN nota >= 4.0 THEN 'regular'
/*se a nota for maior ou igual a  2.0 o desempenho é ruim*/
WHEN nota >= 2.0 THEN 'ruim'
/*senão é péssimo*/
ELSE 'péssimo'
/*Termine a condição com END*/
END
/*após os "AS" colocamos o nome da nova coluna que será exibida, ou seja desempenho*/
AS desempenho
FROM tb_nota;

3º Exemplo

Cenário: Com base na tabela "tb_nota". Queremos saber...



Quantos alunos tiveram um desempenho ótimo?
Quantos alunos tiveram um desempenho bom?
Quantos alunos tiveram um desempenho regular?
Quantos alunos tiveram um desempenho ruim?
Quantos alunos tiveram um desempenho péssimo?

Classificação do desempenho
  • se a nota for maior ou igual a  8.0 o desempenho é ótimo;
  • se a nota for maior ou igual a  6.0 o desempenho é bom;
  • se a nota for maior ou igual a  4.0 o desempenho é regular;
  • se a nota for maior ou igual a  2.0 o desempenho é ruim;
  • senão será péssimo
Para aplicar esta regra, executamos a sentença abaixo:

SELECT
CASE
WHEN nota >= 8.0 THEN 'ótimo'
WHEN nota >= 6.0 THEN 'bom'
WHEN nota >= 4.0 THEN 'regular'
WHEN nota >= 2.0 THEN 'ruim'
ELSE 'péssimo'
END AS desempenho,
COUNT(*) AS quantidade
FROM tb_nota
GROUP BY desempenho
ORDER BY desempenho;



Após a execução poderemos ver o resultado do desempenho na imagem abaixo:






Significado:

SELECT
/*Inicie a condição com CASE*/
CASE
/*se a nota for maior ou igual a  8.0 o desempenho é ótimo*/
WHEN nota >= 8.0 THEN 'ótimo'
/*se a nota for maior ou igual a  6.0 o desempenho é bom*/
WHEN nota >= 6.0 THEN 'bom'
/*se a nota for maior ou igual a  4.0 o desempenho é regular*/
WHEN nota >= 4.0 THEN 'regular'
/*se a nota for maior ou igual a  2.0 o desempenho é ruim*/
WHEN nota >= 2.0 THEN 'ruim'
/*senão é péssimo*/
ELSE 'péssimo'
/*Termine a condição com END*/
END
/*após os "AS" colocamos o nome da nova coluna que será exibida, ou seja desempenho*/
AS desempenho,
/*A função COUNT faz a contagem por desempenho, ou seja quantos tiveram desempenho bom, ruim, etc
*Chamamos a coluna que exibirá a contagem de quantidade.
*/
COUNT(*) AS quantidade
FROM tb_nota
/*agrupa os desempenhos*/
GROUP BY desempenho
/*ordena a coluna desempenho em ordem alfabética*/
ORDER BY desempenho;

4º Exemplo

Classificar os alunos de acordo com o sexo e com a nota.

Neste exemplo, vamos utilizar, o "CASE WHEN ANINHADO", para classificarmos mais de uma condição dentro do "CASE WHEN"
Veja o script com o exemplo e a visualização no: github (está página carrega mais rápido em conexões lentas) ou no sqlfiddle.

7 comentários:

  1. Quando houver duas condições, por exemplo: se for menino e tirou mais que 8 então "bom"
    se for menina e tirou mais que 8 então "Boa"

    ?

    ResponderExcluir
    Respostas
    1. Boa Tarde Rafael, segue abaixo um exemplo com o script, no caso você tem que usar o "CASE WHEN" aninhado, ou seja um "CASE WHEN" DENTRO DE OUTRO "CASE WHEN":


      /*CRIAÇÃO DE UMA TABELA*/

      CREATE TABLE TB_NOTA
      (
      id serial,
      sexo varchar(1),
      nota numeric (5,2)
      );

      /*INCLUSÃO DE DADOS NA TABELA*/

      INSERT INTO TB_NOTA (sexo, nota) VALUES ('F', 9.00);
      INSERT INTO TB_NOTA (sexo, nota) VALUES ('F', 8.50);
      INSERT INTO TB_NOTA (sexo, nota) VALUES ('F', 6.40);
      INSERT INTO TB_NOTA (sexo, nota) VALUES ('F', 4.20);
      INSERT INTO TB_NOTA (sexo, nota) VALUES ('F', 10.0);
      INSERT INTO TB_NOTA (sexo, nota) VALUES ('F', 8.50);
      INSERT INTO TB_NOTA (sexo, nota) VALUES ('F', 6.40);
      INSERT INTO TB_NOTA (sexo, nota) VALUES ('F', 4.20);
      INSERT INTO TB_NOTA (sexo, nota) VALUES ('M', 10.00);
      INSERT INTO TB_NOTA (sexo, nota) VALUES ('M', 8.25);
      INSERT INTO TB_NOTA (sexo, nota) VALUES ('M', 7.40);
      INSERT INTO TB_NOTA (sexo, nota) VALUES ('M', 6.20);
      INSERT INTO TB_NOTA (sexo, nota) VALUES ('M', 3.5);
      INSERT INTO TB_NOTA (sexo, nota) VALUES ('M', 2.5);


      /*EXEMPLO DO SELECT COM CASE WHEN ANINHADO*/
      /*Utilize o operador relacional ">=", (maior ou igual para classificar a nota no "CASE WHEN")*/

      SELECT
      id,
      sexo,
      nota,
      CASE
      /*Quando a nota for maior ou igual que 9*/
      WHEN (nota >= 9) THEN
      CASE
      /*Quando o sexo for feminino*/
      WHEN (sexo = 'F') THEN
      'Garota você tirou uma Ótima nota'
      /*Quando o sexo for masculino*/
      WHEN (sexo = 'M') THEN
      'Garoto você tirou uma Ótima nota'
      END
      WHEN (nota >= 8) THEN
      CASE
      /*Quando o sexo for feminino*/
      WHEN (sexo = 'F') THEN
      'Garota você tirou uma Boa nota'
      /*Quando o sexo for masculino*/
      WHEN (sexo = 'M') THEN
      'Garoto você tirou uma Boa nota'
      END
      WHEN (nota >= 5) THEN
      CASE
      /*Quando o sexo for feminino*/
      WHEN (sexo = 'F') THEN
      'Garota você tirou uma nota Regular'
      /*Quando o sexo for masculino*/
      WHEN (sexo = 'M') THEN
      'Garoto você tirou uma nota Regular'
      END
      ELSE
      CASE
      /*Quando o sexo for feminino*/
      WHEN (sexo = 'F') THEN
      'Garota você tirou uma nota Ruim'
      /*Quando o sexo for masculino*/
      WHEN (sexo = 'M') THEN
      'Garoto você tirou uma nota Ruim'
      END
      END AS classificacao_nota
      FROM TB_NOTA;

      --RESULTADO DO SELECT

      id sexo nota classificacao_nota
      114 F 9 Garota você tirou uma Ótima nota
      115 F 8.5 Garota você tirou uma Boa nota
      116 F 6.4 Garota você tirou uma nota Regular
      117 F 4.2 Garota você tirou uma nota Ruim
      118 F 10 Garota você tirou uma Ótima nota
      119 F 8.5 Garota você tirou uma Boa nota
      120 F 6.4 Garota você tirou uma nota Regular
      121 F 4.2 Garota você tirou uma nota Ruim
      122 M 10 Garoto você tirou uma Ótima nota
      123 M 8.25 Garoto você tirou uma Boa nota
      124 M 7.4 Garoto você tirou uma nota Regular
      125 M 6.2 Garoto você tirou uma nota Regular
      126 M 3.5 Garoto você tirou uma nota Ruim
      127 M 2.5 Garoto você tirou uma nota Ruim

      Excluir
  2. Ao colar o script foram perdidos a cor e a identação: postei no sqlfiddle:
    http://sqlfiddle.com/#!15/920e0/1
    que permite uma melhor visualização:
    * Na parte de cima estão os scripts com o exemplo do "CASE WHEN ANINHADO";
    *Utilize a barra de rolagem do navegador até o final e veja a exibição da tabela com o resultado do "SELECT".

    ResponderExcluir
  3. E para colocar uma condição na busca. Tipo listar só alunos acima de 8.0?

    ResponderExcluir
    Respostas
    1. Primeiramente, obrigada por acompanhar o blog.
      Segue um exemplo, espero que ajude.

      Exemplo:

      CREATE TABLE TB_NOTA
      (
      id serial,
      aluno varchar(255),
      nota numeric (5,2)
      );

      /*INCLUSÃO DE DADOS NA TABELA*/

      INSERT INTO TB_NOTA (aluno, nota) VALUES ('Paulo', 9.00);
      INSERT INTO TB_NOTA (aluno, nota) VALUES ('Maria', 8.50);
      INSERT INTO TB_NOTA (aluno, nota) VALUES ('Joao', 6.40);
      INSERT INTO TB_NOTA (aluno, nota) VALUES ('Ana', 4.20);
      INSERT INTO TB_NOTA (aluno, nota) VALUES ('Maria', 10.0);
      INSERT INTO TB_NOTA (aluno, nota) VALUES ('Joana', 8.50);
      INSERT INTO TB_NOTA (aluno, nota) VALUES ('Paula', 6.40);
      INSERT INTO TB_NOTA (aluno, nota) VALUES ('Marcos', 4.20);

      /*
      ESTA CONSUTA (QUERY) - FILTRA APENAS OS ALUNOS QUE TIRARAM NOTA MAIOR OU IGUAL A 8
      FOI UTILIZADO O COMANDO "WHERE"
      */

      SELECT id,
      aluno,
      nota,
      'ótimo' AS desempenho
      FROM TB_NOTA
      WHERE (nota >= 8) ;

      Excluir