The POUZDRO je příkaz, který provozuje logické dotazy typu if-then-else. Tento příkaz vrátí hodnotu, když se zadaná podmínka vyhodnotí jako True. Když se žádná podmínka nevyhodnotí jako True, vrátí hodnotu části ELSE.
Pokud neexistuje žádná ELSE část a žádná podmínka není vyhodnocena jako True, vrátí hodnotu NULL.
V jazyce Structured Query Language se příkaz CASE používá v příkazech SELECT, INSERT a DELETE s následujícími třemi klauzulemi:
- Klauzule WHERE
- OBJEDNAT PODLE klauzule
- GROUP BY klauzule
Za tímto příkazem v SQL vždy následuje alespoň jeden pár příkazů WHEN a THEN a vždy je zakončen klíčovým slovem END.
Příkaz CASE je v relačních databázích dvou typů:
- Jednoduchý příkaz CASE
- Vyhledaný příkaz CASE
Syntaxe příkazu CASE v SQL
CASE WHEN condition_1 THEN statement_1 WHEN condition_2 THEN statement_2 ……. WHEN condition_N THEN statement_N ELSE result END;
Zde příkaz CASE vyhodnocuje každou podmínku jednu po druhé.
Pokud výraz odpovídá podmínce první klauzule WHEN, přeskočí všechny další podmínky WHEN a THEN a ve výsledku vrátí příkaz_1.
Pokud výraz neodpovídá první podmínce WHEN, porovná se se sekundovou podmínkou WHEN. Tento proces porovnávání bude pokračovat, dokud nebude výraz porovnán s jakoukoli podmínkou WHEN.
Pokud výrazu neodpovídá žádná podmínka, ovládací prvek automaticky přejde do části ELSE a vrátí svůj výsledek. V syntaxi CASE je část ELSE volitelná.
V syntaxi jsou CASE a END nejdůležitější klíčová slova, která ukazují začátek a konec příkazu CASE.
Příklady příkazů CASE v SQL
Vezměme si tabulku Student_Details, která obsahuje číslo role, jméno, známky, předmět a město studentů.
Číslo_role | Jméno Stu | Stu_Subject | Stu_Marks | Stu_City |
---|---|---|---|---|
2001 | Akshay | Věda | 92 | Noida |
2002 | RAM | Matematika | 49 | Jaipur |
2004 | Shyam | Angličtina | 52 | Gurgaon |
2005 | yatin | ani náhodou | Čtyři pět | Lucknow |
2006 | Manoj | Počítač | 70 | Ghaziabad |
2007 | Plechové | Matematika | 82 | Noida |
2008 | Vlasy | Věda | 62 | Gurgaon |
2009 | Yogesh | Angličtina | 42 | Lucknow |
2010 | RAM | Počítač | 88 | Dillí |
2011 | Shyam | ani náhodou | 35 | Kanpur |
Příklad 1: Následující příkaz SQL používá jedinou podmínku WHEN a THEN pro příkaz CASE:
java programy
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;
Vysvětlení výše uvedeného dotazu:
Zde příkaz CASE kontroluje, zda je-li Stu_Marks je větší než a rovná se 50, vrátí Student_Passed jinak se přesune do JINÝ díl a vrací Student_Failed v Student_Result sloupec.
Výstup:
Číslo_role | Jméno Stu | Stu_Subject | Stu_Marks | Student_Result |
---|---|---|---|---|
2001 | Akshay | Věda | 92 | Student_Passed |
2002 | RAM | Matematika | 49 | Student_Failed |
2004 | Shyam | Angličtina | 52 | Student_Passed |
2005 | yatin | ani náhodou | Čtyři pět | Student_Failed |
2006 | Manoj | Počítač | 70 | Student_Passed |
2007 | Plechové | Matematika | 82 | Student_Passed |
2008 | Vlasy | Věda | 62 | Student_Passed |
2009 | Yogesh | Angličtina | 42 | Student_Failed |
2010 | RAM | Počítač | 88 | Student_Passed |
2011 | Shyam | ani náhodou | 35 | Student_Failed |
Příklad 2: Následující příkaz SQL přidá do příkazu CASE více než jednu podmínku WHEN a THEN:
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>
Výstup:
Emp_Id | Emp_Name | Emp_Dept | Celkový_plat | Emp_Remarks |
---|---|---|---|---|
1 | Akshay | Finance | 17 000 | Přírůstek |
2 | RAM | Marketing | 9000 | Dekrementovat |
3 | Shyam | Odbyt | 10 000 | Přírůstek |
4 | yatin | Kódování | 12 000 | Přírůstek |
5 | Manoj | Marketing | 8000 | Dekrementovat |
Příklad 4: V tomto příkladu používáme klauzuli ORDER BY s příkazem CASE v SQL:
Vezměme si další tabulku Employee_Details, která obsahuje Emp_ID, Emp_Name, Emp_Dept a Emp_Age.
dva na jeden multiplexer
Data Employee_Details můžeme zkontrolovat pomocí následujícího dotazu v SQL:
Select * From Employee_Details;
Výstup:
Emp_Id | Emp_Name | Emp_Dept | Emp_Age |
---|---|---|---|
1 | Akshay | Finance | 23 |
2 | RAM | Marketing | 24 |
3 | Balram | Odbyt | 25 |
4 | yatin | Kódování | 22 |
5 | Manoj | Marketing | 23 |
6 | Plechové | Finance | 24 |
7 | Vlasy | Finance | 22 |
8 | Yogesh | Kódování | 25 |
9 | Naveen | Marketing | 22 |
10 | Tarun | Finance | 23 |
Následující SQL dotaz zobrazuje všechny podrobnosti o zaměstnancích ve vzestupném pořadí jmen zaměstnanců:
SELECT * FROM Employee_Details ORDER BY Emp_Name;
Výstup:
Emp_Id | Emp_Name | Emp_Dept | Emp_Age |
---|---|---|---|
1 | Akshay | Finance | 23 |
3 | Balram | Odbyt | 25 |
5 | Manoj | Marketing | 23 |
9 | Naveen | Marketing | 22 |
7 | Vlasy | Finance | 22 |
2 | RAM | Marketing | 24 |
6 | Plechové | Finance | 24 |
10 | Tarun | Finance | 23 |
4 | yatin | Kódování | 22 |
8 | Yogesh | Kódování | 25 |
Pokud chcete zobrazit ty zaměstnance nahoře, kteří pracují v oddělení kódování, pak pro tuto operaci musíte použít jeden příkaz WHEN a THEN v příkazu CASE, jak je znázorněno v následujícím dotazu:
SELECT * FROM Employee_Details ORDER BY CASE WHEN Emp_Dept = 'Coding' THEN 0 ELSE 1 END, Emp_Name;
Výstup:
Emp_Id | Emp_Name | Emp_Dept | Emp_Age |
---|---|---|---|
4 | yatin | Kódování | 22 |
8 | Yogesh | Kódování | 25 |
1 | Akshay | Finance | 23 |
3 | Balram | Odbyt | 25 |
5 | Manoj | Marketing | 23 |
9 | Naveen | Marketing | 22 |
7 | Vlasy | Finance | 22 |
2 | RAM | Marketing | 24 |
6 | Plechové | Finance | 24 |
10 | Tarun | Finance | 23 |
60>