Expressão CASE MySQL

Resumo : neste tutorial, você aprenderá como usar a CASEexpressã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 CASEexpressão em qualquer lugar que permita uma expressão válida, por exemplo, SELECTe WHEREcláusulas ORDER BY.

A CASEexpressão possui duas formas: simples CASEe pesquisada CASE.

Observe que o MySQL possui uma CASEinstrução que você pode usar apenas em programas armazenados, como procedimentos armazenados, funções armazenadas, eventos e gatilhos, que não é a CASEexpressão abordada neste tutorial.

CASEExpressão simples

O seguinte ilustra a sintaxe de uma  CASEexpressão simples:

CASE value
   WHEN value1 THEN result1
   WHEN value2 THEN result2
   …
   [ELSE else_result]
ENDLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesta sintaxe, CASEcombina o valor com value1, value2, etc., para igualdade e retorna o correspondente result1, result2,… Se the valuenão for igual a nenhum value1, value2,… CASEretorna o resultado na ELSEcláusula se a ELSEcláusula for especificada.

O CASEcompara valuecom valuesnas WHENcláusulas de igualdade, você não pode usá-lo NULLporque NULL = NULLretorna falso.

CASEExpressão pesquisada

O seguinte mostra a sintaxe de uma CASEexpressão pesquisada:

CASE
   WHEN expression1 THEN result1
   WHEN expression2 THEN result2
   …
   [ELSE else_result]
ENDLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesta sintaxe, as CASEexpressões de avaliação especificadas nas WHENcláusulas. Se uma expressão for avaliada como verdadeira. CASE retorna o resultado correspondente na THENcláusula. Caso contrário, retorna o resultado especificado na ELSEcláusula. Caso a ELSEcláusula não esteja disponível, a CASEexpressão retorna NULL.

A CASEexpressão retorna um resultado cujo tipo de dados depende do contexto onde é utilizado. Por exemplo, se a CASEexpressão for usada no contexto de cadeia de caracteres, ela retornará o resultado como uma cadeia de caracteres. Se a CASEexpressão for usada em um contexto numérico, ela retornará o resultado como um número inteiro, decimal ou um valor real.

CASEExemplos de expressões MySQL

1) Usando a expressão CASE no exemplo da cláusula SELECT

Veja o seguinte orderse customersas 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 )
Exemplo de expressão CASE simples do MySQL

Este exemplo usa a CASEexpressão na SELECTclá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 )
Expressão MySQL CASE com cláusula SELECT

2) Usando a expressão CASE no exemplo da cláusula ORDER BY

O exemplo a seguir usa a CASEexpressã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 )

Experimente

Expressão MySQL CASE com cláusula ORDER BY

3) Usando a expressão CASE com um exemplo de função agregada

O exemplo a seguir usa a CASEexpressã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 )

Experimente

Aqui está a saída:

Expressão MySQL CASE com exemplo de função agregada

Como funciona.

  • Primeiro, a CASEinstruçã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 CASEexpressão MySQL para adicionar lógica if-else às consultas.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *