- 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:
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";
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:
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
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
Quantos alunos tiveram um desempenho ótimo?
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
SELECT
CASE
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:
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.
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.
ResponderExcluirVou passar a seguir um script com exemplo, espero ajudá-lo
ResponderExcluir/*
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