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.

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:
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.
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.
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 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:
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.
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.
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: |
A palavra-chave CASE é seguida pela instrução WHEN, e não há nenhuma expressão entre CASE e WHEN.
Por exemplo: |
| 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: |
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: |
| Um caso simples suporta apenas uma verificação de igualdade, ou seja, se CASE_Expression = VALUE_1, VALUE_2…
Por exemplo: |
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: |
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:
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:
CASO COM ATUALIZAÇÃO
Suponha novamente que temos o 'GuruTabela de 99 pés com duas colunas e quatro linhas, conforme mostrado abaixo:
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:
Vamos consultar o 'GuruTabela 99 para verificar os valores atualizados:
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:
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.













