Fala pessoal Código Master, tudo de bom?
Hoje, quero falar um pouco sobre um recurso muito utilizado na progração, porém pouco explorado por uma parte dos programadores iniciantes, que é o CASE, neste caso, CASE em banco de dados MySQL.
O CASE simula um switch em um banco de dados MySQL.
Pode ser utilizado livre, dentro de uma estrutura como por exemplo uma procedure, ou mesmo em uma consulta SELECT
Um CASE possui basicamente duas sintaxes, como pode ser visto abaixo.
Primeiro formato de declaração: case_value.
O case_value é uma condição que será devidamente comparada em cada cláusula WHEN até que um deles atenda. Quando um valor igual é encontrado, a cláusula THEN correspondente é executada.
Se nenhum valor igual for encontrado, a cláusula ELSE será executada por padrão, caso haja um ELSE definido.
1 2 3 4 5 |
CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE statement_list] END CASE |
O segundo formato de declaração é chamado de when_value.
Semelhante à primeira declaraçõ, cada expressão de condição de pesquisa da cláusula WHEN é avaliada até que uma seja verdadeira e a cláusula THEN correspondente será executada.
1 2 3 4 5 |
CASE WHEN search_condition THEN statement_list [WHEN search_condition THEN statement_list] ... [ELSE statement_list] END CASE |
Fonte: https://dev.mysql.com/doc/refman/5.7/en/case.html
Cada statement_list consiste em uma ou mais instruções SQL. Não é permitida uma statement_list vazia.
Para lidar com situações em que nenhum valor é correspondido por nenhuma cláusula WHEN, use um ELSE que contenha um bloco BEGIN … END vazio, conforme mostrado neste exemplo.
1 2 3 4 5 6 7 |
CASE v WHEN 2 THEN SELECT v; WHEN 3 THEN SELECT 0; ELSE BEGIN END; END CASE; |
Bom, já vimos como funciona a declaração do CASE. Veja um exemplo de como aplicar o conceito em casos reais.
Considere a seguinte tabela;
1 2 3 4 5 6 7 8 9 10 11 |
CREATE TABLE `client` ( `client` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(400) NOT NULL, `age` int(11), PRIMARY KEY (`client`) ); INSERT INTO `client` (`name`, `age`) VALUES ('Claudeci Goularte', 34), ('Noah Goularte', 3), ('Maria Eduarda', NULL); |
Ao realizarmos a consulta no banco, temos o seguinte resultado:
1 2 3 4 5 6 7 8 9 |
SELECT * FROM client; +--------+-------------------+------+ | client | name | age | +--------+-------------------+------+ | 1 | Claudeci Goularte | 34 | | 2 | Noah Goularte | 3 | | 3 | Maria Eduarda | NULL | +--------+-------------------+------+ |
Digamos que desejamos saber, dos clientes cadastrados, quais são maior de idade. Então, podemos utilizar o CASE em nossa consulta, da seguinte forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
SELECT client, name, age, CASE WHEN age >= 18 THEN 'Maior de idade' ELSE 'Menor de idade' END AS agef FROM client; +--------+-------------------+------+----------------+ | client | name | age | agef | +--------+-------------------+------+----------------+ | 1 | Claudeci Goularte | 34 | Maior de idade | | 2 | Noah Goularte | 3 | Menor de idade | | 3 | Maria Eduarda | NULL | Menor de idade | +--------+-------------------+------+----------------+ |
Observe que o valor NULL, foi considerado na consulta, como menor de idade, pois não corresponde à condição de age > 18. Podemos nestes casos adicionar mais condições que atendam ao esperado.
Veja um novo exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
SELECT client, name, age, CASE WHEN age >= 18 THEN 'Maior de idade' WHEN age < 18 THEN 'Menor de idade' ELSE 'Não informado' END AS agef FROM client; +--------+-------------------+------+----------------+ | client | name | age | agef | +--------+-------------------+------+----------------+ | 1 | Claudeci Goularte | 34 | Maior de idade | | 2 | Noah Goularte | 3 | Menor de idade | | 3 | Maria Eduarda | NULL | Não informado | +--------+-------------------+------+----------------+ |
Veja que aplicando mais condiões ao nosso CASE, conseguimos segar a um resultado satisfatório.
Vamos alterar a idade da client “Maria Eduarda” para 18 anos por exemplo, para podermos utilizar a outra sintaxe apresentada do CASE.
1 |
UPDATE client SET age = 18 WHERE client = 3; |
Agora temos:
1 2 3 4 5 6 7 |
+--------+-------------------+------+ | client | name | age | +--------+-------------------+------+ | 1 | Claudeci Goularte | 34 | | 2 | Noah Goularte | 3 | | 3 | Maria Eduarda | 18 | +--------+-------------------+------+ |
Vejamos como ficaria uma outra estrutura do CASE:
1 2 3 4 5 6 |
SELECT client, name, age, CASE WHEN age >= 18 THEN 'Maior de idade' ELSE 'Menor de idade' END AS agef FROM client; |
Obtivemos o seguitne resultado:
1 2 3 4 5 6 7 |
+--------+-------------------+------+----------------+ | client | name | age | agef | +--------+-------------------+------+----------------+ | 1 | Claudeci Goularte | 34 | Maior de idade | | 2 | Noah Goularte | 3 | Menor de idade | | 3 | Maria Eduarda | 18 | Maior de idade | +--------+-------------------+------+----------------+ |
Bom, é isso. Espero que tenham gostado e nos vemos na próxima.