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

Visão geral do caso na vida real!

Novamente, na vida real, realizamos diferentes ações dependendo do resultado de diferentes condições.

Para elaborar mais, considere o exemplo abaixo:

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

Vamos considerar categorizar Condição e Ação separadamente do exemplo acima:

Condições - Passagens aéreas Ações realizadas, somente se Condição for VERDADEIRO
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 governa ações separadas. Ex.: Visitante realizará o ato de visitar Nova York somente na condição de a passagem aérea estar entre US$ 100 e US$ 200.

Da mesma forma, a instrução MS SQL CASE também fornece 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?

Instrução CASE no SQL Server é a extensão da instrução IF…ELSE. Ao contrário de IF…ELSE, onde apenas o máximo de uma condição é permitida, CASE permite ao usuário aplicar múltiplas condições para executar diferentes conjuntos de ações no MS SQL. Retorna um valor correspondente associado à condição definida pelo usuário.

Vamos aprender como usar Case em SQL e seu conceito nas seções a seguir.

In MS SQL, existem dois tipos de CASE.

  1. CASO Simples
  2. CASO pesquisado

CASO Simples

A 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 Expressão_Caso denota a expressão com a qual eventualmente seremos comparados Valor_1, Valor_2...
  • Os parametros Declaração_1, Declaração_2… denotam as instruções que serão executadas se Case_Expression = Valor_1, Case_Expression = Valor_2,… e assim por diante.
  • Em poucas palavras, o condição é se Case_Expression = Value_N e ACTION é a execução de Statement_N se o o resultado acima é VERDADEIRO.
  • ALIAS_NAME é opcional e é o nome alternativo fornecido ao resultado da instrução CASE do SQL Server. Usado principalmente quando usamos Case na cláusula de seleção do servidor SQL.

Regras para Caso Simples

  • Simple Case permite apenas verificação de igualdade de Case_Expression com Value_1 a Value_N.
  • A Case_Expression é comparada com o Value, 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 será comparado com Value_2 para equivalência. Este processo de comparação Case_Expression com Value continuará até que Case_Expression encontre um valor equivalente correspondente no conjunto de Value_1, Value_2,…
  • Se nada corresponder, o controle irá para a instrução ELSE e Statement_Else será executado.
  • ELSE é opcional.
  • Se ELSE não estiver presente e Case_Expression não corresponder a nenhum dos valores, então Nulo será exibido.

O diagrama abaixo ilustra o fluxo de execução do Simple Case.

Trabalho de declaração de caso simples
Trabalho de declaração de caso simples

Exemplos

Suposição: Suponha que temos a tabela como 'Guru99' com duas colunas e quatro linhas conforme mostrado abaixo:

Caso Simples no SQL Server

Nós vamos usar 'Guru99' tabela em mais exemplos

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 mais nada.

Caso Simples no SQL Server

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.

Caso Simples no SQL Server

CASO pesquisado

A sintaxe do 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,…denota a expressão que será avaliada como TRUE ou FALSE.
  • Os parâmetros Statement_1, Statement_2… denotam as instruções que serão executadas se o resultado Boolean_Expression_1, Boolean_Expression_2 correspondente for TRUE.
  • Resumindo, Condição é Boolean_Expression_1,… e ACTION é a execução de Statement_N se acima de boolean_Expression_1 for TRUE.
  • ALIAS_NAME é opcional e é o nome alternativo dado ao resultado da instrução CASE. Usado principalmente quando usamos CASE na cláusula select.

Regras para Caso Pesquisado

  • Ao contrário do caso simples, o Caso Procurado não se restringe apenas à verificação de igualdade, mas permite a expressão booleana.
  • A expressão booleana é avaliada em ordem a partir da primeira expressão booleana, ou seja, Boolean_expression_1. Abaixo está a abordagem de execução:
    • Se Boolean_expression_1 for TRUE, então outras instruções WHEN…THEN serão ignoradas e a execução de CASE terminará imediatamente.
    • Se Boolean_expression_1 for FALSE, então Boolean_expression_2 será avaliado para a condição TRUE. Este processo de avaliação da expressão_booleana continuará até que uma das expressões_booleanas retorne TRUE.
    • Se nada corresponder, o controle irá para a instrução ELSE e Statement_Else será executado.
  • Assim como o caso simples, ELSE também é opcional no caso de pesquisa.
  • Se ELSE não estiver presente e nenhuma expressão booleana retornar TRUE, então Null será exibido.

Abaixo do Diagrama ilustrar o fluxo de execução do Caso pesquisado.

Trabalho da declaração do caso pesquisado

Trabalho da declaração do caso pesquisado

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: Diagrama abaixo explica o fluxo de execução que acontecerá no marco da CASO PESQUISADO com NÃO MAIS.

Exemplo de CASE pesquisado no SQL Server

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

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: Diagrama abaixo explica o fluxo de execução of o CASO PESQUISADO com SENÃO.

CASE pesquisado no SQL Server

Diferença entre abordagem de execução: SIMPLE e SEARCH CASE.

Vamos dar uma olhada em CASO SIMPLES exemplo 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_nome' faz parte da expressão CASE em SQL. Então 'Tutorial_nome' o valor é comparado com cada QUANDO valores, ou seja, 'SQL'… até que 'Tutorial_name' corresponda aos valores WHEN.

Ao contrário, CASO DE PESQUISA exemplo não tem Expressão CASO:

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 QUANDO tem a sua Expressão booleana condicional. Cada expressão booleana ou seja, Tutorial_name = 'SQL',… é avaliado para VERDADEIRO FALSO até primeiro booleano expressão que avalia como VERDADEIRO.

Diferença entre caso simples e pesquisado

Caso Simples Caso pesquisado
A palavra-chave CASE é imediatamente seguida por CASE_Expression e 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á expressão entre CASE e WHEN.

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

No caso simples, VALUE existe para cada instrução WHEN. Estes valores: Valor_1, Valor_2… São comparados com uma única CASE_Expression sequencialmente. O resultado é avaliado para a condição TRUE/FALSE para cada instrução WHEN.

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

No caso pesquisado, Boolean_Expression existe para cada instrução WHEN. Este Boolean_Expressions: Boolean_Expression_1, Boolean_Expression_2,… avalia a condição TRUE/FALSE para cada instrução WHEN.

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

Caso Simples suporta apenas verificação de igualdade. Ou seja, se CASE_Expression = VALUE_1, VALUE_2…

Por exemplo:
CASO WHEN Valor_1 THEN Instrução_1…No exemplo acima, a única operação realizada pelo sistema é verificar se Case_Expression = Value_1

Com Boolean_Expression_N, Search Case suporta qualquer operação que resulte em um valor booleano. Inclui operador igual e diferente.

Por exemplo:
CASO QUANDO THEN Statement_1… No exemplo acima, Boolean_Expression_1 pode conter os operadores 'igual a' e 'diferente de' como A = B, A! = B.

CASE aninhado: CASE em IF ELSE

Podemos usar CASO dentro SE ELSE. Abaixo está o 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, CASE é NESTED dentro da instrução IF…ELSE:

Primeiro, a instrução IF será executada e se a condição do caso em Servidor SQL for False, a instrução ELSE será executada.

Caso contrário, contenha a instrução CASE aninhada em SQL dentro dela. Dependendo do valor da passagem aérea, um dos seguintes resultados será exibido:

  • O sistema imprimirá 'Visitar local turístico próximo' se as passagens aéreas custarem > US$ 400
  • O sistema imprimirá 'Visite Los Angeles' se as passagens aéreas estiverem ENTRE US$ 0 E US$ 100
  • O sistema imprimirá 'Visit New York' se as passagens aéreas estiverem ENTRE US$ 101 E US$ 200
  • O sistema imprimirá 'Visit Europe' se as passagens aéreas estiverem ENTRE US$ 201 E US$ 400

CASE aninhado no SQL Server

CASE aninhado: CASE dentro de CASE

Podemos usar CASE dentro de CASE em SQL. Abaixo está o 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, CASE está NESTED dentro de outra instrução CASE:

O sistema começa executando o CASE externo. Se Flight_Ticket <$400 então o CASE interno será executado.

Dependendo do valor da passagem aérea, um dos seguintes resultados será exibido:

  • O sistema imprimirá 'Visitar local turístico próximo' se as passagens aéreas custarem > US$ 400
  • O sistema imprimirá 'Visite Los Angeles' se as passagens aéreas estiverem ENTRE US$ 0 E US$ 100
  • O sistema imprimirá 'Visit New York' se as passagens aéreas estiverem ENTRE US$ 101 E US$ 200
  • O sistema imprimirá 'Visit Europe' se as passagens aéreas estiverem ENTRE US$ 201 E US$ 400

Exemplo de CASE aninhado no SQL Server

CASO COM ATUALIZAÇÃO

Suposição: Suponha que temos a tabela como ‘Guru99’ com duas colunas e quatro linhas conforme mostrado abaixo:

CASE com UPDATE no SQL Server

Usaremos a tabela 'Guru99' em outros exemplos

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, CASE é usado na instrução UPDATE.

Dependendo do valor Tutorial_Name, a coluna Tutorial_Name receberá a atualização com o valor da instrução THEN.

  • Se Tutorial_Name = 'SQL' ENTÃO atualize Tutorial_Name para 'Linguagem de consulta estruturada'
  • Se Tutorial_Name = 'PL/SQL' ENTÃO atualize Tutorial_Name para 'Oracle PL/SQL'
  • Se Tutorial_Name = ‘MSSQL’ ENTÃO atualize Tutorial_Name para ‘Microsoft SQL'
  • Se Tutorial_Name = 'Hadoop' ENTÃO atualize Tutorial_Name para 'Apache Hadoop'

CASE com UPDATE no SQL Server

Vamos consultar a tabela Guru99 para verificar o valor atualizado:

CASE com UPDATE no SQL Server

CASO com pedido por

Podemos usar CASE com Order By. Abaixo está o 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 quando a primeira expressão booleana WHEN é avaliada como TRUE, Tutorial_ID é selecionado para Ordenar por Condição

CASE com Order by no SQL Server

Fatos interessantes!

  • CASE pode ser aninhado em outro CASE, bem como em outra instrução IF…ELSE.
  • Além de SELECT, CASE pode ser usado com outro SQL cláusula como UPDATE, ORDER BY.

Resumo

  • No MS SQL, existem dois tipos de CASE: CASE Simples e CASE Pesquisado
  • ELSE é opcional na instrução CASE.