logo

CAS SQL

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:

  1. Clàusula ON
  2. Clàusula ORDER BY
  3. 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:

  1. Declaració CASE simple
  2. 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 &gt;= 90 THEN &apos;Outstanding&apos; WHEN Stu_Marks &gt;= 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&apos;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) &gt;= 10000 THEN &apos;Increment&apos; ELSE &apos;Constant&apos; 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&apos;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 = &apos;Coding&apos; 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 = &apos;Coding&apos; 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