MySQL - Trabalhando com IFs e CASEs


Não, não é só nas linguagens de programação que temos IF's e CASE's, no SQL também os temos e este artigo é justamente para falarmos um pouco sobre eles e algumas utilizações.

Vamos iniciar exibindo a nossa tabela teste

id nome idade estado
1 Pedro 50 SP
2 Antonio 30 RJ
3 Amélia 20 SP
4 Marta 15 SP
5 Maria 80 SP
6 NULL NULL RJ

Trabalhando com IF


A sintaxe básica é a que segue abaixo

SELECT *,IF(estado = 'SP', 'São Paulo','Rio de Janeiro') AS nome_do_estado FROM teste

id nome idade estado nome_do_estado
1 Pedro 50 SP São Paulo
2 Antonio 30 RJ Rio de Janeiro
3 Amélia 20 SP São Paulo
4 Marta 15 SP São Paulo
5 Maria 80 SP São Paulo
NULL NULL RJ Rio de Janeiro

Ou seja, IF(campo = 'valor1', 'resposta 1','resposta 2') onde 'resposta 1' ocorre se o valor de um determinado regisro de "campo" for igual a 'valor1'

Podemos também aninhar IF's e fazer comparações maior e menor que.

SELECT *,IF(idade > 60, 'Idoso',IF(idade < 30, 'Jovem', 'Meia Idade')) AS faixa_etaria FROM teste

id nome idade estado faixa_etaria
1 Pedro 50 SP Meia Idade
2 Antonio 30 RJ Meia Idade
3 Amélia 20 SP Jovem
4 Marta 15 SP Jovem
5 Maria 80 SP Idoso
6 NULL NULL RJ Meia Idade

Podemos também utilizar o IF para 'melhorar' o retorno destes valores NULL.

SELECT id,IF(nome IS NULL, ' - ',nome) AS nome,IF(idade IS NULL, ' - ',idade) AS idade,estado,IF(idade > 60, 'Idoso',IF(idade < 30, 'Jovem', 'Meia Idade')) AS faixa_etaria  FROM teste

id nome idade estado faixa_etaria
1 Pedro 50 SP Meia Idade
2 Antonio 30 RJ Meia Idade
3 Amélia 20 SP Jovem
4 Marta 15 SP Jovem
5 Maria 80 SP Idoso
6 - - RJ Meia Idade

A faixa etária também pode ser corrigida utilizando a mesma técnica do IF aninhado. Podemos utilizar também o IFNULL() para fazer a mesma coisa.

SELECT id,IFNULL(nome,' - ') AS nome,IFNULL(idade, ' - ') AS idade,estado,IF(idade > 60, 'Idoso',IF(idade < 30, 'Jovem', 'Meia Idade')) AS faixa_etaria FROM teste

Ou seja:
IF(expr1 IS NOT NULL,expr1,expr2)
e
IFNULL(expr1,expr2)
São equivalentes.

A mesma técnica pode ser utilizadas para melhorar o retorno de casos de divisões por zero.

Vendo pela perspectiva da eficiência, utilizar IFNULL é melhor para o processamento.

Trabalhando com CASE


Alguns dos procedimentos feitos com IF podem ser feitos com CASE também. A diferença é que nos casos em que temos de escrever vários IF's aninhados, o CASE facilita muito o procedimento.

SELECT *,CASE estado WHEN 'SP' THEN 'São Paulo' WHEN 'RJ' THEN 'Rio de Janeiro' END AS nome_do_estado FROM teste

id nome idade estado nome_do_estado
1 Pedro 50 SP São Paulo
2 Antonio 30 RJ Rio de Janeiro
3 Amélia 20 SP São Paulo
4 Marta 15 SP São Paulo
5 Maria 80 SP São Paulo
6 NULL NULL RJ Rio de Janeiro

SELECT *,CASE nome WHEN 'Pedro' THEN 'Masculino' WHEN 'Antonio' THEN 'Masculino' WHEN 'Amelia' THEN 'Feminino' WHEN 'Marta' THEN 'Feminino' WHEN 'Maria' THEN 'Feminino' END AS sexo FROM teste

id nome idade estado sexo
1 Pedro 50 SP Masculino
2 Antonio 30 RJ Masculino
3 Amélia 20 SP Feminino
4 Marta 15 SP Feminino
5 Maria 80 SP Feminino
6 NULL NULL RJ NULL

Valeu pela visita!

Comentários

Postar um comentário

Postagens mais visitadas deste blog

PHP - Utilizando proxy e CURL para acessar servidores ou sites

MySQL - Cálculo de período de tempo entre duas datas com TIMESTAMPDIFF

MySQL - Completando quantidades fixas de caracteres com as funções LPAD() e RPAD()