El CAIXA és una instrucció que opera el tipus de consultes lògiques if-then-else. Aquesta instrucció retorna el valor quan la condició especificada s'avalua com a True. Quan cap condició s'avalua com a True, retorna el valor de la part ELSE.
arbre de cerca binari
Quan no hi ha cap part ELSE i cap condició s'avalua com a True, retorna un valor NULL.
En el llenguatge de consulta estructurat, la instrucció CASE s'utilitza a les sentències SELECT, INSERT i DELETE amb les tres clàusules següents:
- Clàusula ON
- Clàusula ORDER BY
- Clàusula GRUP PER
Aquesta declaració en SQL sempre va seguida d'almenys un parell de sentències WHEN i THEN i sempre acaba amb la paraula clau END.
La instrucció CASE és de dos tipus a les bases de dades relacionals:
- Declaració CASE simple
- Declaració CASE cercada
Sintaxi de la instrucció CASE en SQL
CASE WHEN condition_1 THEN statement_1 WHEN condition_2 THEN statement_2 ……. WHEN condition_N THEN statement_N ELSE result END;
Aquí, la instrucció CASE avalua cada condició una per una.
Si l'expressió coincideix amb la condició de la primera clàusula WHEN, omet totes les altres condicions WHEN i THEN i retorna la declaració_1 al resultat.
Si l'expressió no coincideix amb la primera condició QUAN, es compara amb la condició QUAN dels segons. Aquest procés de concordança continuarà fins que l'expressió coincideixi amb qualsevol condició WHEN.
Si no coincideix cap condició amb l'expressió, el control passa automàticament a la part ELSE i retorna el seu resultat. A la sintaxi CASE, la part ELSE és opcional.
A la sintaxi, CAS i FIN són les paraules clau més importants que mostren el començament i el tancament de la instrucció CASE.
llista d'usuaris mysql
Exemples de sentència CASE en SQL
Prenem la taula Student_Details, que conté roll_no, nom, notes, assignatura i ciutat dels estudiants.
Roll_No | Stu_Nom | Stu_Subjecte | Stu_Marks | Stu_Ciutat |
---|---|---|---|---|
2001 | Akshay | Ciència | 92 | Noida |
2002 | Ram | Matemàtiques | 49 | Jaipur |
2004 | Shyam | Anglès | 52 | Gurgaon |
2005 | yatin | No | 45 | Lucknow |
2006 | Manoj | Ordinador | 70 | Ghaziabad |
2007 | Xapa | Matemàtiques | 82 | Noida |
2008 | El cabell | Ciència | 62 | Gurgaon |
2009 | Yogesh | Anglès | 42 | Lucknow |
2010 | Ram | Ordinador | 88 | Delhi |
2011 | Shyam | No | 35 | Kanpur |
Exemple 1: La següent instrucció SQL utilitza una única condició WHEN i THEN per a la instrucció 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;
Explicació de la consulta anterior:
Aquí, la instrucció CASE comprova que si Stu_Marks és major i és igual a 50, torna Estudiant_Aprovat en cas contrari es trasllada a la ALTRES part i torna Student_Failed en el Resultat_estudiant columna.
Sortida:
Roll_No | Stu_Nom | Stu_Subjecte | Stu_Marks | Resultat_estudiant |
---|---|---|---|---|
2001 | Akshay | Ciència | 92 | Estudiant_Aprovat |
2002 | Ram | Matemàtiques | 49 | Student_Failed |
2004 | Shyam | Anglès | 52 | Estudiant_Aprovat |
2005 | yatin | No | 45 | Student_Failed |
2006 | Manoj | Ordinador | 70 | Estudiant_Aprovat |
2007 | Xapa | Matemàtiques | 82 | Estudiant_Aprovat |
2008 | El cabell | Ciència | 62 | Estudiant_Aprovat |
2009 | Yogesh | Anglès | 42 | Student_Failed |
2010 | Ram | Ordinador | 88 | Estudiant_Aprovat |
2011 | Shyam | No | 35 | Student_Failed |
Exemple 2: La següent instrucció SQL afegeix més d'una condició WHEN i THEN a la instrucció 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>
Sortida:
Emp_Id | Emp_Nom | Emp_Dept | Sala_total | Emp_Observacions |
---|---|---|---|---|
1 | Akshay | Finances | 17000 | Increment |
2 | Ram | Màrqueting | 9000 | Decrement |
3 | Shyam | Vendes | 10000 | Increment |
4 | yatin | Codificació | 12000 | Increment |
5 | Manoj | Màrqueting | 8000 | Decrement |
Exemple 4: En aquest exemple, utilitzem la clàusula ORDER BY amb una instrucció CASE en SQL:
Prenem una altra taula Employee_Details que conté Emp_ID, Emp_Name, Emp_Dept i Emp_Age.
Podem comprovar les dades de Employee_Details utilitzant la següent consulta en SQL:
com convertir una cadena en un int
Select * From Employee_Details;
Sortida:
Emp_Id | Emp_Nom | Emp_Dept | Emp_Edat |
---|---|---|---|
1 | Akshay | Finances | 23 |
2 | Ram | Màrqueting | 24 |
3 | Balram | Vendes | 25 |
4 | yatin | Codificació | 22 |
5 | Manoj | Màrqueting | 23 |
6 | Xapa | Finances | 24 |
7 | El cabell | Finances | 22 |
8 | Yogesh | Codificació | 25 |
9 | Naveen | Màrqueting | 22 |
10 | Tarun | Finances | 23 |
La consulta SQL següent mostra tots els detalls dels empleats en ordre ascendent dels noms dels empleats:
SELECT * FROM Employee_Details ORDER BY Emp_Name;
Sortida:
Emp_Id | Emp_Nom | Emp_Dept | Emp_Edat |
---|---|---|---|
1 | Akshay | Finances | 23 |
3 | Balram | Vendes | 25 |
5 | Manoj | Màrqueting | 23 |
9 | Naveen | Màrqueting | 22 |
7 | El cabell | Finances | 22 |
2 | Ram | Màrqueting | 24 |
6 | Xapa | Finances | 24 |
10 | Tarun | Finances | 23 |
4 | yatin | Codificació | 22 |
8 | Yogesh | Codificació | 25 |
Si voleu mostrar els empleats a la part superior que treballen al departament de codificació, per a aquesta operació, heu d'utilitzar una sola instrucció WHEN i THEN a la instrucció CASE, tal com es mostra a la consulta següent:
SELECT * FROM Employee_Details ORDER BY CASE WHEN Emp_Dept = 'Coding' THEN 0 ELSE 1 END, Emp_Name;
Sortida:
Emp_Id | Emp_Nom | Emp_Dept | Emp_Edat |
---|---|---|---|
4 | yatin | Codificació | 22 |
8 | Yogesh | Codificació | 25 |
1 | Akshay | Finances | 23 |
3 | Balram | Vendes | 25 |
5 | Manoj | Màrqueting | 23 |
9 | Naveen | Màrqueting | 22 |
7 | El cabell | Finances | 22 |
2 | Ram | Màrqueting | 24 |
6 | Xapa | Finances | 24 |
10 | Tarun | Finances | 23 |
60>