Resumo : neste tutorial, você aprenderá como usar a CASE
expressão MySQL para adicionar lógica if-else às consultas.
Introdução à expressão MySQL CASE
A expressão MySQL CASE
é uma estrutura de fluxo de controle que permite adicionar lógica if-else a uma consulta. De modo geral, você pode usar a CASE
expressão em qualquer lugar que permita uma expressão válida, por exemplo, SELECT
e WHERE
cláusulas ORDER BY
.
A CASE
expressão possui duas formas: simples CASE
e pesquisada CASE
.
Observe que o MySQL possui uma CASE
instrução que você pode usar apenas em programas armazenados, como procedimentos armazenados, funções armazenadas, eventos e gatilhos, que não é a CASE
expressão abordada neste tutorial.
CASE
Expressão simples
O seguinte ilustra a sintaxe de uma CASE
expressão simples:
CASE value
WHEN value1 THEN result1
WHEN value2 THEN result2
…
[ELSE else_result]
END
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe, CASE
combina o valor com value1
, value2
, etc., para igualdade e retorna o correspondente result1
, result2
,… Se the value
não for igual a nenhum value1
, value2
,… CASE
retorna o resultado na ELSE
cláusula se a ELSE
cláusula for especificada.
O CASE
compara value
com values
nas WHEN
cláusulas de igualdade, você não pode usá-lo NULL
porque NULL = NULL
retorna falso.
CASE
Expressão pesquisada
O seguinte mostra a sintaxe de uma CASE
expressão pesquisada:
CASE
WHEN expression1 THEN result1
WHEN expression2 THEN result2
…
[ELSE else_result]
END
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe, as CASE
expressões de avaliação especificadas nas WHEN
cláusulas. Se uma expressão for avaliada como verdadeira. CASE retorna o resultado correspondente na THEN
cláusula. Caso contrário, retorna o resultado especificado na ELSE
cláusula. Caso a ELSE
cláusula não esteja disponível, a CASE
expressão retorna NULL
.
A CASE
expressão retorna um resultado cujo tipo de dados depende do contexto onde é utilizado. Por exemplo, se a CASE
expressão for usada no contexto de cadeia de caracteres, ela retornará o resultado como uma cadeia de caracteres. Se a CASE
expressão for usada em um contexto numérico, ela retornará o resultado como um número inteiro, decimal ou um valor real.
CASE
Exemplos de expressões MySQL
1) Usando a expressão CASE no exemplo da cláusula SELECT
Veja o seguinte orders
e customers
as tabelas:
A declaração a seguir retorna os clientes e seus pedidos:
SELECT
customerName,
COUNT(*) orderCount
FROM
orders
INNER JOIN customers
USING (customerNumber)
GROUP BY customerName
ORDER BY COUNT(*);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Este exemplo usa a CASE
expressão na SELECT
cláusula para retornar o tipo de clientes com base no número de pedidos que os clientes solicitaram:
WITH cte AS (
SELECT
customerName,
COUNT(*) orderCount
FROM
orders
INNER JOIN customers
USING (customerNumber)
GROUP BY customerName
)
SELECT
customerName,
orderCount,
CASE orderCount
WHEN 1 THEN 'One-time Customer'
WHEN 2 THEN 'Repeated Customer'
WHEN 3 THEN 'Frequent Customer'
ELSE 'Loyal Customer'
end customerType
FROM
cte
ORDER BY customerName;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
2) Usando a expressão CASE no exemplo da cláusula ORDER BY
O exemplo a seguir usa a CASE
expressão para classificar os clientes por estado, se o estado não for NULL
, ou classificar o país, caso o estado seja NULL
:
SELECT
customerName,
state,
country
FROM
customers
ORDER BY (
CASE
WHEN state IS NULL
THEN country
ELSE state
END);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
3) Usando a expressão CASE com um exemplo de função agregada
O exemplo a seguir usa a CASE
expressão com a SUM()
função para calcular o total de pedidos de vendas por status do pedido:
SELECT
SUM(CASE
WHEN status = 'Shipped' THEN 1
ELSE 0
END) AS 'Shipped',
SUM(CASE
WHEN status = 'On Hold' THEN 1
ELSE 0
END) AS 'On Hold',
SUM(CASE
WHEN status = 'In Process' THEN 1
ELSE 0
END) AS 'In Process',
SUM(CASE
WHEN status = 'Resolved' THEN 1
ELSE 0
END) AS 'Resolved',
SUM(CASE
WHEN status = 'Cancelled' THEN 1
ELSE 0
END) AS 'Cancelled',
SUM(CASE
WHEN status = 'Disputed' THEN 1
ELSE 0
END) AS 'Disputed',
COUNT(*) AS Total
FROM
orders;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Aqui está a saída:
Como funciona.
- Primeiro, a
CASE
instrução retorna 1 se o status for igual ao status correspondente, como Enviado, em espera, em processo, cancelado, contestado e zero caso contrário. - Em segundo lugar, a
SUM()
função retorna o número total de pedidos por status de pedido.
Neste tutorial, você aprendeu como usar a CASE
expressão MySQL para adicionar lógica if-else às consultas.