Capítulo 3
4-Estruturas Avançadas, Parte 2
Veremos duas estruturas específicas:
4.1 - Função if
4.2 - Predicado Case
Função if()
A função MySQL IF é uma das funções de fluxo de controle do MySQL que retorna um valor com base em uma condição. A função IF às vezes é chamada de função IF ELSE ou IF THEN ELSE. A sintaxe da função MySQL IF é a seguinte:
IF(expr,if_true_expr,if_false_expr)
Podemos usar o if() em um query simples ou junto com consultas a tabelas. Veja os exemplos a seguir.
Exemplo 1: exemplos com Função if()
mysql> select if (3 > 2,'3 é maior que 2','') as 'testa if()';
+------------------+
| testa if() |
+------------------+
| 3 é maior que 2 |
+------------------+
1 row in set (0.00 sec)
mysql> SELECT IF(500 < 1000, 'verdadeiro', 'falso') as 'if 500 < 100';
+--------------+
| if 500 < 100 |
+--------------+
| verdadeiro |
+--------------+
1 row in set (0.00 sec)
Podemos usar if em consultas de tabelas, como mostram os exemplos de consultas no banco livraria dados abaixo:
Exemplo 2: exemplos com Função if()
mysql> select titulo,if(assunto = 'B','Banco de Dados','--') assunto
-> from livro;
+-----------------------------------+----------------+
| titulo | assunto |
+-----------------------------------+----------------+
| Banco de Dados para Web | Banco de Dados |
| Programando em Linguagem C | -- |
| Programando em Linguagem C++ | -- |
| Banco de Dados na Bioinformática | Banco de Dados |
| Redes de Computadores | -- |
| teste | -- |
+-----------------------------------+----------------+
6 rows in set (0.00 sec)
mysql> select if(titulo like 'Prog%',titulo,'') as 'Livros de Programação' from livro;
+------------------------------+
| Livros de Programação |
+------------------------------+
| |
| Programando em Linguagem C |
| Programando em Linguagem C++ |
| |
| |
| |
+------------------------------+
6 rows in set (0.00 sec)
mysql> select
-> count(if(assunto = 'B',1,NULL)) 'Banco de Dados',
-> count(if(assunto = 'P',1,NULL)) 'Programação',
-> count(if(assunto = 'R',1,NULL)) 'Redes'
-> from livro;
+----------------+---------------+-------+
| Banco de Dados | Programação | Redes |
+----------------+---------------+-------+
| 2 | 3 | 1 |
+----------------+---------------+-------+
1 row in set (0.03 sec)
mysql> select sum(if(assunto = 'B',1,NULL)) 'Banco de Dados', sum(if(assunto = 'P',1,NULL)) 'Programação', sum(if(assunto = 'R',1,NULL)) 'Redes' from livro;
+----------------+---------------+-------+
| Banco de Dados | Programação | Redes |
+----------------+---------------+-------+
| 2 | 3 | 1 |
+----------------+---------------+-------+
1 row in set (0.00 sec)
O Predicado CASE
A expressão CASE do MySQL é uma estrutura de fluxo de controle que permite adicionar lógica if-else com diferentes opções a uma consulta. Podemos usar a expressão CASE em qualquer lugar que permita uma expressão válida, por exemplo, cláusulas SELECT, WHERE e ORDER BY.
A expressão CASE tem dois formatos:
A expressão CASE simples (simple case ou case-value) compara um valor ou uma expressão a um conjunto de expressões simples para determinar o resultado.
A expressão CASE pesquisada (searched CASE ou when-value) avalia um conjunto de expressões booleanas para determinar o resultado.
Ambos os formatos suportam um argumento ELSE opcional.
Case na Forma Simples
Sintaxe do Case na Forma Simples
CASE value
WHEN value1 THEN result1
WHEN value2 THEN result2
…
[ELSE else_result]
END
O exemplo a seguir usa o banco de livraria e faz consulta com a estrutura CASE.
Exemplo 3: usando case no banco livraria
mysql> select case assunto
-> when 'B' then 'Relevante'
-> when 'P' then 'Irrelavante'
-> end as Relevancia
-> from livro;
+-------------+
| Relevancia |
+-------------+
| Relevante |
| Irrelavante |
| Irrelavante |
| Relevante |
| NULL |
| Irrelavante |
+-------------+
6 rows in set (0.00 sec)
Podemos melhorar o resultado, mostrando o assunto e sua relevância para o estudo de banco de dados.
Exemplo 4: usando case no banco livraria
mysql> select assunto, case assunto when 'B' then 'Muito' when 'P' then 'Médio'
when 'R' then 'Pouco' end as Relevancia from livro;
+---------+------------+
| assunto | Relevancia |
+---------+------------+
| B | Muito |
| P | Médio |
| P | Médio |
| B | Muito |
| R | Pouco |
| P | Médio |
+---------+------------+
6 rows in set (0.00 sec)
No próximo exemplo, melhoramos ainda mais a consulta, agora mostrando o assunto ao invés de seu código.
Exemplo 5: usando case no banco livraria
mysql> select descricao, case assunto when 'B' then 'Muito' when 'P' then 'Médio' when 'R' then 'Pouco' end as Relevancia from livro
-> inner join assunto on assunto = sigla;
+----------------+------------+
| descricao | Relevancia |
+----------------+------------+
| Banco de Dados | Muito |
| Programação | Médio |
| Programação | Médio |
| Banco de Dados | Muito |
| Redes | Pouco |
| Programação | Médio |
+----------------+------------+
6 rows in set (0.01 sec)
Expressão CASE "pesquisada (searched CASE)
Expressão CASE pesquisada permite que façamos testes usando diferentes colunas, variáveis e expressões. O seguinte mostra a sintaxe de uma expressão CASE pesquisada:Sintaxe do Case na Forma "pesquisada"
CASE
WHEN expression1 THEN result1
WHEN expression2 THEN result2
…
[ELSE else_result]
END
O seguinte exemplo usa o banco de dados livraria para fazer um consulta que usa CASE.
Exemplo
Para livros que possuem data de lançamento e o preço superior a R$45,00 retornar o título concatenado com a expressão - "livro caro". Para livros que não possuem data de lançamento, retornar o título concatenado com a expressão "lançamento em breve". E para livros com preço abaixo de 45 reais apresentar a saída com o título concatenado com "livro barato".
Exemplo 6: usando case no banco livraria
mysql> select case
-> when lancamento is not null and preco > 40
-> then concat(titulo,' - livro caro')
-> when lancamento is null and editora is not null
-> then concat(titulo,' - lancamento em breve')
-> when editora is null
-> then concat(titulo,' - em preparação')
-> else concat(titulo,' - livro barato')
-> end as 'Característica'
-> from livro;
+---------------------------------------------------------+
| Característica |
+---------------------------------------------------------+
| Banco de Dados para Web - livro barato |
| Programando em Linguagem C - livro barato |
| Programando em Linguagem C++ - livro caro |
| Banco de Dados na Bioinformática - lancamento em breve |
| Redes de Computadores - livro caro |
+---------------------------------------------------------+
6 rows in set (0.01 sec)
Exercício
Execute os exemplos apresentados nessa seção.