Translate

terça-feira, 12 de novembro de 2013

Mysql - IF e CASE

Neste post vamos apresentar 4 exemplos:

  • 1 exemplo de como utilizar a expressão condicional "if";
  • 3 exemplos de como utilizar a expressão condicional "case";

EXPRESSÃO CONDICIONAL - IF

O uso do "If" é indicado quando temos que testar 1 condição. Esta expressão tem a funcionalidade de:

testar uma condição
    se a condição for verdadeira, executa algo
    se a condição for falsa, executa algo diferente

SINTAXE
IF(teste, 'verdadeiro', falso)

1º Exemplo

Cenário: em uma loja de informática temos que verificar o estoque de produtos. Se a quantidade de um determinado produto for maior que 50, vamos considerar que o estoque está alto, caso contrário vamos considerar que o estoque está baixo. Vamos utilizar a tabela "tb_estoque" para fazer esta verificação. 
Veja a imagem da tabela "tb_estoque" abaixo:


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

SELECT
IF(quantidade > 50, 'alto', 'baixo') AS classificacao
FROM tb_estoque;

Após a execução da sentença, podemos ver o resultado na imagem abaixo:




EXPRESSÃO CONDICIONAL - CASE

O uso do "Case" é indicado quando temos que testar mais que 1 condição.
Esta expressão tem a funcionalidade de:

Testar uma condição 
    Se for verdadeira,  executa algo e sai da instrução, senão vai para o próximo teste
Testar uma segunda condição
    Se for verdadeira,  executa algo e sai da instrução, senão vai para o próximo teste
Testar uma terceira condição
    Se for verdadeira,  executa algo e sai da instrução, senão vai para o próximo teste
... e assim por diante


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;


Em breve postaremos mais exemplos com expressões condicionais.

2 comentários:

  1. E no caso de executar um outro comando se a expressão for verdadeira ou falsa ? por exemplo, quero aplicar um delete caso este mesmos registro não existir nas tabelas: tbProcessos, tbFinanceiro a idéia era permitir excluir um cliente se ele nao tivesse movimentações na empresa.

    ResponderExcluir
  2. Vou passar a seguir um script com exemplo, espero ajudá-lo
    /*
    Esta tabela de clientes
    nome da tabela: tb_cliente
    Colunas:
    cli_id => identificação do cliente
    cli_nome => nome do cliente
    */
    CREATE TABLE tb_cliente
    (
    cli_id integer NOT NULL,
    cli_nome character varying(255),
    CONSTRAINT pk_cli_id PRIMARY KEY (cli_id)
    );

    /*
    Esta tabela de processos
    nome da tabela: tb_processo
    Colunas:
    pro_id => identificação do processo
    pro_nome => nome do processo
    cli_id => identificação do cliente
    */
    CREATE TABLE tb_processo
    (
    pro_id integer NOT NULL,
    pro_nome character varying(255),
    cli_id integer NOT NULL,
    CONSTRAINT pk_pro_id PRIMARY KEY (pro_id),
    CONSTRAINT fk_pro_cli_id FOREIGN KEY (cli_id) REFERENCES tb_cliente (cli_id)
    );

    /*
    Esta tabela do financeiro
    nome da tabela: tb_financeiro
    Colunas:
    fin_id => identificação do registro
    fin_valor => valor
    cli_id => identificação do cliente

    */
    CREATE TABLE tb_financeiro
    (
    fin_id integer NOT NULL,
    fin_valor numeric(11,2),
    cli_id integer NOT NULL,
    CONSTRAINT pk_fin_id PRIMARY KEY (fin_id),
    CONSTRAINT fk_fin_cli_id FOREIGN KEY (cli_id) REFERENCES tb_cliente (cli_id)
    );


    /*
    Insere registros nas tabelas
    */
    INSERT INTO tb_cliente VALUES(1, 'Paulo Silva');
    INSERT INTO tb_cliente VALUES(2, 'Ana Pereira');
    INSERT INTO tb_cliente VALUES(3, 'Bruno Soares');

    INSERT INTO tb_processo VALUES(45455, 'Processo A', 1);
    INSERT INTO tb_processo VALUES(25651, 'Processo B', 2);

    INSERT INTO tb_financeiro VALUES(92454, 2541.40, 1);


    /*
    Visualizar os registros da tabela tb_cliente
    */
    SELECT * FROM tb_cliente

    /*
    Visualizar os registros da tabela tb_processo
    */
    SELECT * FROM tb_processo

    /*
    Visualizar os registros da tabela tb_financeiro
    */
    SELECT * FROM tb_financeiro


    --Este procedimento pode ser feito de duas formas:

    /*
    1ª FORMA DE APAGAR OS REGISTROS DA TABELA CLIENTES
    UTIZAR A SENTENÇA "NOT EXISTS"
    SERÃO DELETADOS SOMENTE OS REGISTROS DOS CLIENTES DA TABELA DE CLIENTES
    QUE NÃO ESTÃO NA TABELA DE PROCESSO E TAMBÉM NÃO ESTÃO NA TABELA FINANCEIRO
    */

    --IMPORTANTE!!! ANTES DE DELETAR FAÇA DE PREFERÊNCIA UM BACKUP DAS TABELAS OU UM SELECT

    SELECT * FROM tb_cliente
    WHERE
    NOT EXISTS
    (
    SELECT
    tb_processo.cli_id
    FROM tb_processo
    WHERE tb_processo.cli_id = tb_cliente.cli_id
    ) AND
    NOT EXISTS
    (
    SELECT
    tb_financeiro.cli_id
    FROM tb_financeiro
    WHERE tb_financeiro.cli_id = tb_cliente.cli_id
    );

    /*
    VEJA NO SELECT QUE SOMENTE O CLI_ID = 3 "Bruno Soares" será deletado, pois ele
    não está na tabela de processos e também não está na tabela financeiro
    */

    --IMPORTANTE!!! ANTES DE DELETAR FAÇA DE PREFERÊNCIA UM BACKUP DAS TABELAS OU UM SELECT
    DELETE FROM tb_cliente
    WHERE
    NOT EXISTS
    (
    SELECT
    tb_processo.cli_id
    FROM tb_processo
    WHERE tb_processo.cli_id = tb_cliente.cli_id
    ) AND
    NOT EXISTS
    (
    SELECT
    tb_financeiro.cli_id
    FROM tb_financeiro
    WHERE tb_financeiro.cli_id = tb_cliente.cli_id
    );

    /*
    Veja que a tabela cliente agora possui somente dois registros
    */
    SELECT * FROM tb_cliente

    /*
    2ª FORMA --UTIZAR A SENTENÇA "NOT IN"
    SERÃO DELETADOS SOMENTE OS REGISTROS DOS CLIENTES DA TABELA DE CLIENTES
    QUE NÃO ESTÃO NA TABELA DE PROCESSO E TAMBÉM NÃO ESTÃO NA TABELA FINANCEIRO
    */


    SELECT * FROM tb_cliente WHERE
    tb_cliente.cli_id NOT IN
    (
    SELECT
    cli_id
    FROM
    tb_processo
    ) AND
    tb_cliente.cli_id NOT IN
    (
    SELECT
    cli_id
    FROM
    tb_financeiro
    );


    --IMPORTANTE!!! ANTES DE DELETAR FAÇA DE PREFERÊNCIA UM BACKUP DAS TABELAS OU UM SELECT
    DELETE FROM tb_cliente WHERE
    tb_cliente.cli_id NOT IN
    (
    SELECT
    cli_id
    FROM
    tb_processo
    ) AND
    tb_cliente.cli_id NOT IN
    (

    SELECT
    cli_id
    FROM
    tb_financeiro
    );

    /*
    Veja que a tabela cliente agora possui somente dois registros
    */
    SELECT * FROM tb_cliente

    ResponderExcluir