Instrução CASE e caso aninhado no SQL Server: exemplo T-SQL

⚡ Resumo Inteligente

CASE é uma expressão condicional no SQL Server que retorna um valor com base na primeira condição que for avaliada como verdadeira, oferecendo formas Simples e Pesquisadas, além de aninhamento dentro de IF…ELSE, UPDATE e ORDER BY.

  • 🧭 Valor condicional: Uma expressão CASE retorna um valor que depende de qual condição WHEN for avaliada primeiro como verdadeira.
  • 1️⃣ Caso simples: O CASE simples compara uma expressão com uma lista de valores e realiza uma verificação de igualdade para cada condição WHEN.
  • 🔎 Caso pesquisado: A função CASE pesquisada avalia uma expressão booleana separada para cada condição WHEN, suportando intervalos e operadores de desigualdade.
  • ELSE é opcional: Quando não há correspondência com a condição WHEN e a condição ELSE é omitida, a expressão CASE retorna NULL.
  • 🪆 Aninhamento: A instrução CASE pode ser aninhada dentro de outra instrução CASE e dentro de uma instrução IF…ELSE para lógica de vários níveis.
  • 🔧 Além do SELECT: Além do SELECT, o CASE funciona com as cláusulas UPDATE e ORDER BY para realizar atualizações condicionais e ordenação.

Instrução CASE e CASE aninhado no SQL Server com exemplos em T-SQL

Visão geral do caso na vida real!

Novamente, na vida real, realizamos ações diferentes dependendo do resultado de diferentes condições. Para elaborar melhor, considere o exemplo abaixo:

  • Se as passagens aéreas custarem menos de US$ 100, visitarei Los Angeles.
  • Se as passagens aéreas custarem entre US$ 100 e US$ 200, então irei visitar Nova York.
  • Se as passagens aéreas custarem entre US$ 200 e US$ 400, então irei para a Europa.
  • Caso contrário, prefiro visitar um ponto turístico próximo.

Vamos considerar categorizar a condição e a ação separadamente do exemplo acima:

Condições – Passagens Aéreas Ações executadas somente se a condição for VERDADEIRA.
Less de $ 100 Visite Los Angeles
Entre US $ 100 e US $ 200 Visite Nova York
Entre US $ 200 e US $ 400 Visite a europa
Nenhuma das condições acima atendidas Ponto turístico próximo

No exemplo acima, podemos ver que o resultado das diferentes condições determina uma ação específica. Por exemplo, o visitante só realizará a viagem a Nova York se a passagem aérea custar entre US$ 100 e US$ 200. Da mesma forma, MS SQL A instrução CASE também oferece a capacidade de executar diferentes instruções T-SQL com base no resultado de diferentes condições.

O que é a instrução CASE no SQL Server?

Declaração CASE em SQL Server é a extensão do SE… OUTRO Ao contrário do IF…ELSE, que permite no máximo uma condição, o CASE permite ao usuário aplicar múltiplas condições para executar diferentes conjuntos de ações no MS SQL. Ele retorna um valor correspondente à condição definida pelo usuário.

Vamos aprender como usar CASE em SQL e seu conceito nas seções seguintes. No MS SQL, existem dois tipos de CASE:

  • CASO Simples
  • CASO pesquisado

CASO Simples

Sintaxe para Caso Simples

CASE <Case_Expression>
     WHEN Value_1 THEN Statement_1
     WHEN Value_2 THEN Statement_2
     .
     .
     WHEN Value_N THEN Statement_N
     [ELSE Statement_Else]   
END AS [ALIAS_NAME]

Aqui:

  • O parâmetro Case_Expression indica a expressão que será comparada com Value_1, Value_2 e assim por diante.
  • Os parâmetros Statement_1, Statement_2… denotam as instruções que serão executadas se Case_Expression = Value_1, Case_Expression = Value_2 e assim por diante.
  • Em resumo, a condição é se Case_Expression = Value_N, e a ação é a execução de Statement_N se o resultado acima for VERDADEIRO.
  • ALIAS_NAME é opcional e é o nome alternativo atribuído ao resultado da instrução CASE do SQL Server. É usado principalmente quando utilizamos CASE na cláusula SELECT do SQL Server.

Regras para Caso Simples

  • O Simple Case permite apenas uma verificação de igualdade entre Case_Expression e Value_1 e Value_N.
  • A expressão `Case_Expression` é comparada com um valor, em ordem, começando pelo primeiro valor, ou seja, `Value_1`. Abaixo está a abordagem de execução:
  • Se Case_Expression for equivalente a Value_1, então outras instruções WHEN…THEN serão ignoradas e a execução de CASE terminará imediatamente.
  • Se Case_Expression não corresponder a Value_1, então Case_Expression é comparada com Value_2 para verificar a equivalência. Esse processo de comparação de Case_Expression com um valor continua até que Case_Expression encontre um valor equivalente correspondente no conjunto de Value_1, Value_2 e assim por diante.
  • Se nada corresponder, o controle passa para a instrução ELSE, e a instrução Statement_Else é executada.
  • ELSE é opcional.
  • Se ELSE não estiver presente e Case_Expression não corresponder a nenhum dos valores, então NULL será exibido.

O diagrama abaixo ilustra o fluxo de execução de um Caso Simples:

Fluxograma mostrando como um CASE simples avalia cada valor WHEN em ordem.

Exemplos

Suponha que temos uma tabela chamada 'Guru99' com duas colunas, Tutorial_ID e Tutorial_name, e quatro linhas, conforme mostrado abaixo. Usaremos este 'GuruTabela 99 nos exemplos que se seguem.

Amostra GuruTabela 99 com colunas Tutorial_ID e Tutorial_name e quatro linhas.

Consulta 1: CASO SIMPLES com a opção NO ELSE

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Resultado: O diagrama abaixo explica o fluxo de execução de um CASO SIMPLES sem NENHUM ELSE.

Resultado de um CASE simples sem ELSE, mostrando um Description para cada Tutorial_name

Consulta 2: CASO SIMPLES com a opção ELSE

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Resultado: O diagrama abaixo explica o fluxo de execução de um CASE SIMPLES com ELSE.

Resultado de um CASE simples com ELSE, retornando o texto padrão para linhas não correspondentes.

CASO pesquisado

Sintaxe para caso pesquisado

CASE 
     WHEN <Boolean_Expression_1> THEN Statement_1
     WHEN <Boolean_Expression_2> THEN Statement_2
     .
     .
     WHEN <Boolean_Expression_N> THEN Statement_N
     [ELSE Statement_Else]   
END AS [ALIAS_NAME]

Aqui:

  • O parâmetro Boolean_Expression_1… indica a expressão que será avaliada como VERDADEIRA ou FALSA.
  • Os parâmetros Statement_1, Statement_2… denotam as instruções que serão executadas se o resultado correspondente de Boolean_Expression_1, Boolean_Expression_2 for VERDADEIRO.
  • Em resumo, a condição é Boolean_Expression_1… e a ação é a execução de Statement_N se a Boolean_Expression_1 acima for VERDADEIRA.
  • ALIAS_NAME é opcional e é o nome alternativo atribuído ao resultado da instrução CASE. É usado principalmente quando utilizamos CASE na cláusula SELECT.

Regras para Caso Pesquisado

  • Diferentemente do Caso Simples, o Caso Pesquisado não se restringe apenas à verificação de igualdade, mas permite uma expressão booleana.
  • A expressão booleana é avaliada, em ordem, começando pela primeira expressão booleana, ou seja, Boolean_Expression_1. Abaixo está a abordagem de execução:
  • Se Boolean_Expression_1 for VERDADEIRA, as instruções WHEN…THEN subsequentes serão ignoradas e a execução do CASE TERMINARÁ imediatamente.
  • Se a expressão booleana 1 for FALSA, então a expressão booleana 2 é avaliada para verificar se é VERDADEIRA. Esse processo de avaliação das expressões booleanas continua até que uma delas retorne VERDADEIRO.
  • Se nada corresponder, o controle passa para a instrução ELSE, e a instrução Statement_Else é executada.
  • Assim como no caso simples, o ELSE também é opcional no caso pesquisado.
  • Se ELSE não estiver presente e nenhuma das expressões booleanas retornar TRUE, então NULL será exibido.

O diagrama abaixo ilustra o fluxo de execução do caso pesquisado:

Fluxograma mostrando como um CASE pesquisado avalia cada expressão booleana em ordem.

Exemplos

Consulta 1: CASO PESQUISADO com a opção NO ELSE

SELECT Tutorial_ID, Tutorial_name,
CASE 
 	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Resultado: O diagrama abaixo explica o fluxo de execução do CASO PESQUISADO sem NENHUM OUTRO.

Resultado de uma busca CASE sem ELSE, correspondendo cada Tutorial_name a um Descriptíon

Consulta 2: CASO PESQUISADO com a opção ELSE

SELECT Tutorial_ID, Tutorial_name,
CASE 
	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Resultado: O diagrama abaixo explica o fluxo de execução do CASO PESQUISADO com ELSE.

Resultado de uma pesquisa CASE com ELSE, retornando o texto padrão para linguagens não SQL.

Diferença entre as abordagens de execução: SIMPLE e SEARCH CASE

Vejamos o exemplo de CASO SIMPLES abaixo:

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Aqui, 'Tutorial_name' faz parte da expressão CASE em SQL. Em seguida, o valor de 'Tutorial_name' é comparado com cada valor WHEN, ou seja, 'SQL'… até que 'Tutorial_name' corresponda a um valor WHEN.

Pelo contrário, o exemplo SEARCH CASE não possui nenhuma expressão CASE:

SELECT Tutorial_ID, Tutorial_name,
CASE 
 	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Aqui, cada instrução WHEN possui sua própria expressão booleana condicional. Cada expressão booleana, por exemplo, Tutorial_name = 'SQL'… é avaliada como VERDADEIRO/FALSO até que a primeira expressão booleana seja avaliada como VERDADEIRO.

Diferença entre caso simples e caso pesquisado

Caso Simples Caso pesquisado
A palavra-chave CASE é imediatamente seguida pela expressão CASE e vem antes da instrução WHEN.

Por exemplo:
CASO
WHEN Valor_1 THEN Instrução_1…

A palavra-chave CASE é seguida pela instrução WHEN, e não há nenhuma expressão entre CASE e WHEN.

Por exemplo:
CASO QUANDO ENTÃO Declaração_1…

Em um caso simples, existe um VALOR para cada instrução WHEN. Esses valores (Valor_1, Valor_2…) são comparados sequencialmente com uma única expressão CASE. O resultado é avaliado para a condição VERDADEIRO/FALSO de cada instrução WHEN.

Por exemplo:
CASO
WHEN Valor_1 THEN Instrução_1…
WHEN Valor_2 THEN Instrução_2…

Em um caso pesquisado, existe uma expressão booleana para cada instrução WHEN. Essas expressões booleanas (expressão_booleana_1, expressão_booleana_2…) avaliam a condição VERDADEIRO/FALSO para cada instrução WHEN.

Por exemplo:
CASO
QUANDO ENTÃO Declaração_1…
QUANDO ENTÃO Declaração_2…

Um caso simples suporta apenas uma verificação de igualdade, ou seja, se CASE_Expression = VALUE_1, VALUE_2…

Por exemplo:
CASO QUANDO Valor_1 ENTÃO Declaração_1…
No exemplo acima, a única operação realizada pelo sistema é verificar se Case_Expression = Value_1.

Com a expressão booleana `Boolean_Expression_N`, um caso pesquisado suporta qualquer operação que resulte em um valor booleano. Isso inclui os operadores de igualdade e de diferença.

Por exemplo:
CASO QUANDO ENTÃO Declaração_1…
No exemplo acima, a expressão booleana 1 pode conter os operadores 'igual a' e 'diferente de', como A = B e A != B.

CASE aninhado: CASE em IF ELSE

Podemos usar CASE dentro de uma instrução IF…ELSE. Declaramos um variável para a passagem aérea e ramificação com base em seu valor. Abaixo está um exemplo de código MS-SQL:

DECLARE @Flight_Ticket int;
SET @Flight_Ticket = 190;
IF @Flight_Ticket > 400
   PRINT 'Visit Nearby Tourist Location';
ELSE 
BEGIN
    SELECT
	CASE 
	WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles'
	WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York'
	WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe'
	END AS Location	
END

No exemplo acima, a instrução CASE está aninhada dentro da instrução IF…ELSE. Primeiro, a instrução IF é executada e, se a condição CASE no SQL Server for False, a instrução ELSE é executada. A parte ELSE contém uma instrução CASE aninhada em SQL. Dependendo do valor da passagem aérea, um dos seguintes resultados é exibido:

  • O sistema imprime a mensagem 'Visite um local turístico próximo' se as passagens aéreas custarem mais de US$ 400.
  • O sistema imprime 'Visite Los Angeles' se as passagens aéreas custarem ENTRE $0 E $100.
  • O sistema imprime 'Visite Nova York' se as passagens aéreas custarem ENTRE US$ 101 E US$ 200.
  • O sistema imprime 'Visite a Europa' se as passagens aéreas custarem ENTRE US$ 201 E US$ 400.

O resultado abaixo mostra a localização retornada quando o CASE aninhado é executado dentro do ramo ELSE:

Resultado de um CASE aninhado dentro de um IF…ELSE, imprimindo o local da visita para o bilhete.

CASE aninhado: CASE dentro de CASE

Podemos usar CASE dentro de outro CASE em SQL. Abaixo está um exemplo de código MS-SQL:

DECLARE @Flight_Ticket int;
SET @Flight_Ticket = 250;
SELECT
CASE 
WHEN @Flight_Ticket >= 400 THEN 'Visit Nearby Tourist Location.'
WHEN @Flight_Ticket < 400 THEN 
    	CASE 
		WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles'
		WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York'
		WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe'
		END	
END AS Location

No exemplo acima, a instrução CASE está aninhada dentro de outra instrução CASE. O sistema executa primeiro a instrução CASE externa; se Flight_Ticket for menor que $400, a instrução CASE interna é executada. O local retornado segue os mesmos intervalos de preços de passagens do exemplo anterior, portanto, uma passagem de $250 se enquadra no intervalo de $201 a $400 e retorna 'Visite a Europa'.

O resultado abaixo mostra a localização retornada pelo CASE interno para um ingresso de $250:

Resultado de um CASO aninhado dentro de outro CASO, retornando Visit Europe para um bilhete de 250

CASO COM ATUALIZAÇÃO

Suponha novamente que temos o 'GuruTabela de 99 pés com duas colunas e quatro linhas, conforme mostrado abaixo:

GuruTabela 99 antes da ATUALIZAÇÃO DE CASO, mostrando os valores originais de Tutorial_Name.

Podemos usar CASE com UPDATE. Abaixo está o exemplo de código MS-SQL:

UPDATE Guru99
SET Tutorial_Name = 
	(
	CASE
	WHEN Tutorial_Name = 'SQL' THEN 'Structured Query language.'
	WHEN Tutorial_Name = 'PL/SQL' THEN 'Oracle PL/SQL'
	WHEN Tutorial_Name = 'MSSQL' THEN 'Microsoft SQL.'
	WHEN Tutorial_Name = 'Hadoop' THEN 'Apache Hadoop.'
	END
	)

No exemplo acima, a cláusula CASE é usada na instrução UPDATE. Dependendo do valor de Tutorial_Name, a coluna Tutorial_Name é atualizada com o valor da instrução THEN:

  • Se Tutorial_Name = 'SQL', atualize Tutorial_Name para 'Structured Query Language'.
  • Se Tutorial_Name = 'PL/SQL', então atualize Tutorial_Name para 'Oracle PL/SQL'.
  • Se Tutorial_Name = 'MSSQL', atualize Tutorial_Name para 'Microsoft SQL'.
  • Se Tutorial_Name = 'Hadoop', atualize Tutorial_Name para 'Apache Hadoop'.

A execução da instrução atualiza as linhas correspondentes, conforme mostrado abaixo:

Resultado da execução da instrução CASE UPDATE no Gurumesa 99

Vamos consultar o 'GuruTabela 99 para verificar os valores atualizados:

GuruTabela 99 após a atualização do caso, mostrando os novos valores de Tutorial_Name.

CASO com pedido por

Podemos usar a cláusula CASE com ORDER BY. Abaixo está um exemplo de código MS-SQL:

Declare @Order Int;
Set @Order = 1
Select * from Guru99 order by 
CASE 
	WHEN @Order = 1 THEN Tutorial_ID
	WHEN @Order = 2 THEN Tutorial_Name
	END
DESC

Aqui, CASE é usado com ORDER BY. @Order é definido como 1 e, como a primeira expressão booleana WHEN é avaliada como TRUE, Tutorial_ID é selecionado para a condição ORDER BY. O resultado é mostrado abaixo:

Resultado da cláusula ORDER BY com uma expressão CASE ordenando o Guru99 tabela por Tutorial_ID

Fatos interessantes!

  • A estrutura CASE pode ser aninhada dentro de outra estrutura CASE, bem como dentro de uma instrução IF…ELSE.
  • Além do SELECT, o CASE pode ser usado com outras cláusulas SQL, como UPDATE e ORDER BY.

Perguntas Frequentes

IIF() é uma abreviação para uma expressão CASE com dois resultados: ela retorna um valor quando a condição é verdadeira e outro quando é falsa. Uma expressão CASE completa é mais flexível e pode testar várias condições WHEN em uma única instrução.

Sim. Como o CASE retorna um valor, ele pode aparecer em uma lista SELECT, em uma cláusula WHERE, em uma cláusula HAVING e em um GROUP BY. Em uma cláusula WHERE, o CASE permite aplicar diferentes lógicas de filtro dependendo dos valores de outras colunas.

Sim. Colocar uma expressão CASE dentro de SUM(), COUNT() ou AVGA função () realiza agregação condicional, totalizando ou contando apenas as linhas que correspondem a cada condição WHEN. Essa técnica é frequentemente usada para criar relatórios de resumo no estilo de tabela dinâmica.

As funções COALESCE e ISNULL retornam apenas o primeiro valor não nulo de uma lista. Uma expressão CASE é mais abrangente: ela avalia condições booleanas arbitrárias ou correspondências de valores e retorna o resultado do primeiro ramo que for verdadeiro.

Uma expressão CASE retorna um único tipo de dados. O SQL Server determina isso com base na precedência do tipo de dados de cada resultado das cláusulas THEN e ELSE, portanto, todos os ramos devem retornar tipos compatíveis para evitar erros de conversão.

Sim. Uma expressão CASE pode aparecer na instrução SELECT de uma view e em qualquer lugar dentro de um procedimento armazenado, função ou gatilho. A mesma sintaxe de expressão funciona em todos esses objetos.

Sim. Travas deslizantes portáteis Copiloto do GitHub É possível elaborar expressões CASE simples e pesquisadas, incluindo CASE aninhado e CASE dentro de UPDATE, a partir de um prompt em linguagem natural. Sempre revise as condições WHEN, a ordem das ramificações e o tratamento de ELSE antes de executar a consulta.

Assistentes de IA e aprendizado de máquina traduzem regras em linguagem natural para expressões CASE simples ou pesquisadas, sugerem ramificações WHEN ausentes e sinalizam sobreposição.ping ou condições inacessíveis. O desenvolvedor revisa cada sugestão para verificar sua correção antes de implementá-la.

Resuma esta postagem com: