O CASO é uma instrução que opera consultas lógicas do tipo if-then-else. Esta instrução retorna o valor quando a condição especificada é avaliada como True. Quando nenhuma condição é avaliada como True, ela retorna o valor da parte ELSE.
Quando não há parte ELSE e nenhuma condição é avaliada como True, ele retorna um valor NULL.
Na linguagem de consulta estruturada, a instrução CASE é usada nas instruções SELECT, INSERT e DELETE com as três cláusulas a seguir:
- Cláusula ONDE
- Cláusula ORDER BY
- Cláusula GROUP BY
Esta instrução em SQL é sempre seguida por pelo menos um par de instruções WHEN e THEN e sempre terminada com a palavra-chave END.
A instrução CASE é de dois tipos em bancos de dados relacionais:
- Instrução CASE simples
- Declaração CASE pesquisada
Sintaxe da instrução CASE em SQL
CASE WHEN condition_1 THEN statement_1 WHEN condition_2 THEN statement_2 ……. WHEN condition_N THEN statement_N ELSE result END;
Aqui, a instrução CASE avalia cada condição uma por uma.
int uma string java
Se a expressão corresponder à condição da primeira cláusula WHEN, ela ignora todas as outras condições WHEN e THEN e retorna a instrução_1 no resultado.
Se a expressão não corresponder à primeira condição WHEN, ela será comparada com a condição WHEN do segundo. Este processo de correspondência continuará até que a expressão corresponda a qualquer condição WHEN.
Se nenhuma condição corresponder à expressão, o controle irá automaticamente para a parte ELSE e retornará seu resultado. Na sintaxe CASE, a parte ELSE é opcional.
lista vinculada e lista de array
Na sintaxe, CASE e END são as palavras-chave mais importantes que mostram o início e o fechamento da instrução CASE.
Exemplos de instrução CASE em SQL
Vamos pegar a tabela Student_Details, que contém roll_no, nome, notas, disciplina e cidade dos alunos.
Núm. da lista | Stu_Nome | Stu_Subject | Stu_Marks | Stu_Cidade |
---|---|---|---|---|
2001 | Akshay | Ciência | 92 | Noida |
2002 | Bater | Matemática | 49 | Jaipur |
2004 | Tímido | Inglês | 52 | Gurgaon |
2005 | Yatin | Não | Quatro cinco | Luck agora |
2006 | Manoj | Computador | 70 | Ghaziabad |
2007 | Folha | Matemática | 82 | Noida |
2008 | O cabelo | Ciência | 62 | Gurgaon |
2009 | Yogesh | Inglês | 42 | Luck agora |
2010 | Bater | Computador | 88 | Délhi |
2011 | Tímido | Não | 35 | Kanpur |
Exemplo 1: A seguinte instrução SQL usa uma única condição WHEN e THEN para a instrução CASE:
SELECT Roll_No, Stu_Name, Stu_Subject, Stu_marks, CASE WHEN Stu_Marks >= 50 THEN 'Student_Passed' ELSE 'Student_Failed' END AS Student_Result FROM Student_Details;
Explicação da consulta acima:
Aqui, a instrução CASE verifica se o Stu_Marks é maior e igual a 50, ele retorna Aluno_Aprovado caso contrário, move-se para o OUTRO parte e devoluções Aluno_Falha no Aluno_Resultado coluna.
Saída:
Núm. da lista | Stu_Nome | Stu_Subject | Stu_Marks | Aluno_Resultado |
---|---|---|---|---|
2001 | Akshay | Ciência | 92 | Aluno_Aprovado |
2002 | Bater | Matemática | 49 | Aluno_Falha |
2004 | Tímido | Inglês | 52 | Aluno_Aprovado |
2005 | Yatin | Não | Quatro cinco | Aluno_Falha |
2006 | Manoj | Computador | 70 | Aluno_Aprovado |
2007 | Folha | Matemática | 82 | Aluno_Aprovado |
2008 | O cabelo | Ciência | 62 | Aluno_Aprovado |
2009 | Yogesh | Inglês | 42 | Aluno_Falha |
2010 | Bater | Computador | 88 | Aluno_Aprovado |
2011 | Tímido | Não | 35 | Aluno_Falha |
Exemplo 2: A seguinte instrução SQL adiciona mais de uma condição WHEN e THEN à instrução CASE:
SELECT Roll_No, Stu_Name, Stu_Subject, Stu_marks, CASE WHEN Stu_Marks >= 90 THEN 'Outstanding' WHEN Stu_Marks >= 80 AND Stu_Marks = 70 AND Stu_Marks = 60 AND Stu_Marks = 50 AND Stu_Marks <60 50 then 'bad' when stu_marks < 'failed' end as stu_remarks from student_details; pre> <p> <strong>Explanation of above query:</strong> </p> <p>Here, the CASE statement checks multiple WHEN and THEN conditions one by one. If the value of <strong>Stu_Marks</strong> column is greater than or equals to <strong>90</strong> , it returns <strong>Outstanding</strong> otherwise moves to the further WHEN and THEN conditions.</p> <p>If none of the conditions is matched with the <strong>Student_Details</strong> table, CASE returns <strong>the NULL</strong> value in the <strong>Stu_Remarks</strong> column because there is no ELSE part in the query.</p> <p> <strong>Output:</strong> </p> <table class="table"> <tr> <th>Roll_No</th> <th>Stu_Name</th> <th>Stu_Subject</th> <th>Stu_Marks</th> <th>Stu_Remarks</th> </tr> <tr> <td>2001</td> <td>Akshay</td> <td>Science</td> <td>92</td> <td>Outstanding</td> </tr> <tr> <td>2002</td> <td>Ram Math</td> <td>49</td> <td>Failed</td> </tr> <tr> <td>2004</td> <td>Shyam</td> <td>English</td> <td>52</td> <td>Bad</td> </tr> <tr> <td>2005</td> <td>Yatin</td> <td>Hindi</td> <td>45</td> <td>Failed</td> </tr> <tr> <td>2006</td> <td>Manoj</td> <td>Computer</td> <td>70</td> <td>Good</td> </tr> <tr> <td>2007</td> <td>Sheetal</td> <td>Math</td> <td>82</td> <td>Excellent</td> </tr> <tr> <td>2008</td> <td>Parul</td> <td>Science</td> <td>62</td> <td>Average</td> </tr> <tr> <td>2009</td> <td>Yogesh</td> <td>English</td> <td>42</td> <td>Failed</td> </tr> <tr> <td>2010</td> <td>Ram</td> <td>Computer</td> <td>88</td> <td>Excellent</td> </tr> <tr> <td>2011</td> <td>Shyam</td> <td>Hindi</td> <td>35</td> <td>Failed</td> </tr> </table> <p> <strong>Example 3:</strong> </p> <p>Let's take another Employee_Details table which contains Emp_ID, Emp_Name, Emp_Dept, and Emp_Salary.</p> <table class="table"> <tr> <th>Emp_Id</th> <th>Emp_Name</th> <th>Emp_Dept</th> <th>Emp_Salary</th> </tr> <tr> <td>1</td> <td>Akshay</td> <td>Finance</td> <td>9000</td> </tr> <tr> <td>2</td> <td>Ram</td> <td>Marketing</td> <td>4000</td> </tr> <tr> <td>3</td> <td>Shyam</td> <td>Sales</td> <td>5000</td> </tr> <tr> <td>4</td> <td>Yatin</td> <td>Coding</td> <td>4000</td> </tr> <tr> <td>5</td> <td>Manoj</td> <td>Marketing</td> <td>5000</td> </tr> <tr> <td>1</td> <td>Akshay</td> <td>Finance</td> <td>8000</td> </tr> <tr> <td>2</td> <td>Ram</td> <td>Coding</td> <td>6000</td> </tr> <tr> <td>3</td> <td>Shyam</td> <td>Coding</td> <td>4000</td> </tr> <tr> <td>4</td> <td>Yatin</td> <td>Marketing</td> <td>8000</td> </tr> <tr> <td>5</td> <td>Manoj</td> <td>Finance</td> <td>3000</td> </tr> </table> <p> <strong>The following SQL query uses GROUP BY clause with CASE statement:</strong> </p> <pre> SELECT Emp_Id, Emp_Name, Emp_Dept, sum(Emp_Salary) as Total_Salary, CASE WHEN SUM(Emp_Salary) >= 10000 THEN 'Increment' ELSE 'Constant' END AS Emp_Remarks FROM Employee_Details GROUP BY Emp_id, Emp_Name; </pre> <p> <strong>Output:</strong> </p> <table class="table"> <tr> <th>Emp_Id</th> <th>Emp_Name</th> <th>Emp_Dept</th> <th>Total_Salary</th> <th>Emp_Remarks</th> </tr> <tr> <td>1</td> <td>Akshay</td> <td>Finance</td> <td>17000</td> <td>Increment</td> </tr> <tr> <td>2</td> <td>Ram</td> <td>Marketing</td> <td>9000</td> <td>Decrement</td> </tr> <tr> <td>3</td> <td>Shyam</td> <td>Sales</td> <td>10000</td> <td>Increment</td> </tr> <tr> <td>4</td> <td>Yatin</td> <td>Coding</td> <td>12000</td> <td>Increment</td> </tr> <tr> <td>5</td> <td>Manoj</td> <td>Marketing</td> <td>8000</td> <td>Decrement</td> </tr> </table> <p> <strong>Example 4: In this example, we use the ORDER BY clause with a CASE statement in SQL:</strong> </p> <p>Let's take another Employee_Details table which contains Emp_ID, Emp_Name, Emp_Dept, and Emp_Age.</p> <p>We can check the data of Employee_Details by using the following query in SQL:</p> <pre> Select * From Employee_Details; </pre> <p> <strong>Output:</strong> </p> <table class="table"> <tr> <th>Emp_Id</th> <th>Emp_Name</th> <th>Emp_Dept</th> <th>Emp_Age</th> </tr> <tr> <td>1</td> <td>Akshay</td> <td>Finance</td> <td>23</td> </tr> <tr> <td>2</td> <td>Ram</td> <td>Marketing</td> <td>24</td> </tr> <tr> <td>3</td> <td>Balram</td> <td>Sales</td> <td>25</td> </tr> <tr> <td>4</td> <td>Yatin</td> <td>Coding</td> <td>22</td> </tr> <tr> <td>5</td> <td>Manoj</td> <td>Marketing</td> <td>23</td> </tr> <tr> <td>6</td> <td>Sheetal</td> <td>Finance</td> <td>24</td> </tr> <tr> <td>7</td> <td>Parul</td> <td>Finance</td> <td>22</td> </tr> <tr> <td>8</td> <td>Yogesh</td> <td>Coding</td> <td>25</td> </tr> <tr> <td>9</td> <td>Naveen</td> <td>Marketing</td> <td>22</td> </tr> <tr> <td>10</td> <td>Tarun</td> <td>Finance</td> <td>23</td> </tr> </table> <p>The following SQL query shows all the details of employees in the ascending order of employee names:</p> <pre> SELECT * FROM Employee_Details ORDER BY Emp_Name; </pre> <p> <strong>Output:</strong> </p> <table class="table"> <tr> <th>Emp_Id</th> <th>Emp_Name</th> <th>Emp_Dept</th> <th>Emp_Age</th> </tr> <tr> <td>1</td> <td>Akshay</td> <td>Finance</td> <td>23</td> </tr> <tr> <td>3</td> <td>Balram</td> <td>Sales</td> <td>25</td> </tr> <tr> <td>5</td> <td>Manoj</td> <td>Marketing</td> <td>23</td> </tr> <tr> <td>9</td> <td>Naveen</td> <td>Marketing</td> <td>22</td> </tr> <tr> <td>7</td> <td>Parul</td> <td>Finance</td> <td>22</td> </tr> <tr> <td>2</td> <td>Ram</td> <td>Marketing</td> <td>24</td> </tr> <tr> <td>6</td> <td>Sheetal</td> <td>Finance</td> <td>24</td> </tr> <tr> <td>10</td> <td>Tarun</td> <td>Finance</td> <td>23</td> </tr> <tr> <td>4</td> <td>Yatin</td> <td>Coding</td> <td>22</td> </tr> <tr> <td>8</td> <td>Yogesh</td> <td>Coding</td> <td>25</td> </tr> </table> <p>If you want to show those employees at the top who work in the Coding Department, then for this operation, you have to use single WHEN and THEN statement in the CASE statement as shown in the following query:</p> <pre> SELECT * FROM Employee_Details ORDER BY CASE WHEN Emp_Dept = 'Coding' THEN 0 ELSE 1 END, Emp_Name; </pre> <p> <strong>Output:</strong> </p> <table class="table"> <tr> <th>Emp_Id</th> <th>Emp_Name</th> <th>Emp_Dept</th> <th>Emp_Age</th> </tr> <tr> <td>4</td> <td>Yatin</td> <td>Coding</td> <td>22</td> </tr> <tr> <td>8</td> <td>Yogesh</td> <td>Coding</td> <td>25</td> </tr> <tr> <td>1</td> <td>Akshay</td> <td>Finance</td> <td>23</td> </tr> <tr> <td>3</td> <td>Balram</td> <td>Sales</td> <td>25</td> </tr> <tr> <td>5</td> <td>Manoj</td> <td>Marketing</td> <td>23</td> </tr> <tr> <td>9</td> <td>Naveen</td> <td>Marketing</td> <td>22</td> </tr> <tr> <td>7</td> <td>Parul</td> <td>Finance</td> <td>22</td> </tr> <tr> <td>2</td> <td>Ram</td> <td>Marketing</td> <td>24</td> </tr> <tr> <td>6</td> <td>Sheetal</td> <td>Finance</td> <td>24</td> </tr> <tr> <td>10</td> <td>Tarun</td> <td>Finance</td> <td>23</td> </tr> </table> <hr></60>
Saída:
Emp_Id | Emp_Name | Emp_Depto. | Salário total | Emp_Remarks |
---|---|---|---|---|
1 | Akshay | Finança | 17.000 | Incremento |
2 | Bater | Marketing | 9.000 | Diminuir |
3 | Tímido | Vendas | 10.000 | Incremento |
4 | Yatin | Codificação | 12.000 | Incremento |
5 | Manoj | Marketing | 8.000 | Diminuir |
Exemplo 4: Neste exemplo, usamos a cláusula ORDER BY com uma instrução CASE em SQL:
Vamos pegar outra tabela Employee_Details que contém Emp_ID, Emp_Name, Emp_Dept e Emp_Age.
char para string
Podemos verificar os dados de Employee_Details usando a seguinte consulta em SQL:
Select * From Employee_Details;
Saída:
Emp_Id | Emp_Name | Emp_Depto. | Emp_Idade |
---|---|---|---|
1 | Akshay | Finança | 23 |
2 | Bater | Marketing | 24 |
3 | Balram | Vendas | 25 |
4 | Yatin | Codificação | 22 |
5 | Manoj | Marketing | 23 |
6 | Folha | Finança | 24 |
7 | O cabelo | Finança | 22 |
8 | Yogesh | Codificação | 25 |
9 | Naveen | Marketing | 22 |
10 | Tarun | Finança | 23 |
A consulta SQL a seguir mostra todos os detalhes dos funcionários em ordem crescente de nomes de funcionários:
SELECT * FROM Employee_Details ORDER BY Emp_Name;
Saída:
Emp_Id | Emp_Name | Emp_Depto. | Emp_Idade |
---|---|---|---|
1 | Akshay | Finança | 23 |
3 | Balram | Vendas | 25 |
5 | Manoj | Marketing | 23 |
9 | Naveen | Marketing | 22 |
7 | O cabelo | Finança | 22 |
2 | Bater | Marketing | 24 |
6 | Folha | Finança | 24 |
10 | Tarun | Finança | 23 |
4 | Yatin | Codificação | 22 |
8 | Yogesh | Codificação | 25 |
Se você deseja mostrar os funcionários no topo que trabalham no Departamento de Codificação, então, para esta operação, você deve usar uma única instrução WHEN e THEN na instrução CASE, conforme mostrado na seguinte consulta:
SELECT * FROM Employee_Details ORDER BY CASE WHEN Emp_Dept = 'Coding' THEN 0 ELSE 1 END, Emp_Name;
Saída:
Emp_Id | Emp_Name | Emp_Depto. | Emp_Idade |
---|---|---|---|
4 | Yatin | Codificação | 22 |
8 | Yogesh | Codificação | 25 |
1 | Akshay | Finança | 23 |
3 | Balram | Vendas | 25 |
5 | Manoj | Marketing | 23 |
9 | Naveen | Marketing | 22 |
7 | O cabelo | Finança | 22 |
2 | Bater | Marketing | 24 |
6 | Folha | Finança | 24 |
10 | Tarun | Finança | 23 |
60>