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.
- CASO Simples
- 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.
Exemplos
Suposição: Suponha que temos a tabela como 'Guru99' com duas colunas e quatro linhas conforme mostrado abaixo:
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.
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
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.
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.
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.
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: |
A palavra-chave Case é seguida pela instrução WHEN e não há expressão entre CASE e WHEN.
Por exemplo: |
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: |
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 Simples suporta apenas verificação de igualdade. Ou seja, se CASE_Expression = VALUE_1, VALUE_2…
Por exemplo: |
Com Boolean_Expression_N, Search Case suporta qualquer operação que resulte em um valor booleano. Inclui operador igual e diferente.
Por exemplo: |
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: 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
CASO COM ATUALIZAÇÃO
Suposição: Suponha que temos a tabela como ‘Guru99’ com duas colunas e quatro linhas conforme mostrado abaixo:
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'
Vamos consultar a tabela Guru99 para verificar o valor atualizado:
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
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.