The CASE yra sakinys, kuris veikia „jei-tada-else“ tipo loginėms užklausoms. Šis sakinys grąžina reikšmę, kai nurodyta sąlyga įvertinama kaip True. Kai nė viena sąlyga neįvertinama į True, ji grąžina ELSE dalies reikšmę.
Kai nėra ELSE dalies ir jokia sąlyga neįvertinama į True, ji grąžina NULL reikšmę.
Struktūrinės užklausos kalboje CASE sakinys naudojamas SELECT, INSERT ir DELETE sakiniuose su šiais trimis sakiniais:
- KUR išlyga
- UŽSAKYMAS PAGAL punktą
- GROUP BY sąlyga
Po šio teiginio SQL visada seka bent viena pora WHEN ir THEN teiginių ir visada baigiama raktiniu žodžiu END.
Reliacinėse duomenų bazėse CASE teiginys yra dviejų tipų:
- Paprastas CASE teiginys
- Ieškota CASE pareiškimo
CASE teiginio sintaksė SQL
CASE WHEN condition_1 THEN statement_1 WHEN condition_2 THEN statement_2 ……. WHEN condition_N THEN statement_N ELSE result END;
Čia CASE teiginys įvertina kiekvieną sąlygą po vieną.
Jei išraiška atitinka pirmojo WHEN sąlygą, ji praleidžia visas kitas WHEN ir THEN sąlygas ir rezultate grąžina teiginį_1.
Jei išraiška neatitinka pirmosios WHEN sąlygos, ji lyginama su sekundės WHEN sąlyga. Šis derinimo procesas tęsis tol, kol išraiška bus suderinta su bet kuria WHEN sąlyga.
Jei jokia sąlyga neatitinka išraiškos, valdiklis automatiškai pereina į ELSE dalį ir grąžina savo rezultatą. CASE sintaksėje ELSE dalis yra neprivaloma.
char į eilutę
Sintaksėje CASE ir END yra svarbiausi raktiniai žodžiai, rodantys CASE sakinio pradžią ir pabaigą.
CASE teiginio pavyzdžiai SQL
Paimkime lentelę Student_Details, kurioje yra roll_no, pavadinimas, pažymiai, dalykas ir studentų miestas.
Roll_No | Stu_Vardas | Stu_Subject | Stu_Marksas | Stu_City |
---|---|---|---|---|
2001 m | Akshay | Mokslas | 92 | Noida |
2002 m | Ram | Matematika | 49 | Džaipuras |
2004 m | Shyam | Anglų | 52 | Gurgaonas |
2005 m | jatin | Ne | Keturi | Laknau |
2006 m | Manoj | Kompiuteris | 70 | Gaziabadas |
2007 m | Lapelis | Matematika | 82 | Noida |
2008 m | Plaukai | Mokslas | 62 | Gurgaonas |
2009 m | Jogešas | Anglų | 42 | Laknau |
2010 m | Ram | Kompiuteris | 88 | Delis |
2011 m | Shyam | Ne | 35 | Kanpuras |
1 pavyzdys: Šis SQL sakinys naudoja vieną sąlygą WHEN ir THEN sakinyje 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;
Aukščiau pateiktos užklausos paaiškinimas:
Čia CASE pareiškimas patikrina, ar Stu_Marksas yra didesnis už ir lygus 50, jis grąžinamas Studentas_išlaikytas kitu atveju persikelia į KITAS dalį ir grąžina Studentas_Nepavyko viduje Studentas_Rezultatas stulpelyje.
Išvestis:
Roll_No | Stu_Vardas | Stu_Subject | Stu_Marksas | Studentas_Rezultatas |
---|---|---|---|---|
2001 m | Akshay | Mokslas | 92 | Studentas_išlaikytas |
2002 m | Ram | Matematika | 49 | Studentas_Nepavyko |
2004 m | Shyam | Anglų | 52 | Studentas_išlaikytas |
2005 m | jatin | Ne | Keturi | Studentas_Nepavyko |
2006 m | Manoj | Kompiuteris | 70 | Studentas_išlaikytas |
2007 m | Lapelis | Matematika | 82 | Studentas_išlaikytas |
2008 m | Plaukai | Mokslas | 62 | Studentas_išlaikytas |
2009 m | Jogešas | Anglų | 42 | Studentas_Nepavyko |
2010 m | Ram | Kompiuteris | 88 | Studentas_išlaikytas |
2011 m | Shyam | Ne | 35 | Studentas_Nepavyko |
2 pavyzdys: Šis SQL sakinys prideda daugiau nei vieną WHEN ir THEN sąlygą prie CASE teiginio:
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>
Išvestis:
Emp_Id | Emp_Name | Emp_Dept | Iš viso_Atlyginimas | Emp_Remarks |
---|---|---|---|---|
1 | Akshay | Finansai | 17 000 | Prieaugis |
2 | Ram | Rinkodara | 9000 | Sumažėjimas |
3 | Shyam | Pardavimai | 10 000 | Prieaugis |
4 | jatin | Kodavimas | 12 000 | Prieaugis |
5 | Manoj | Rinkodara | 8000 | Sumažėjimas |
4 pavyzdys: Šiame pavyzdyje mes naudojame sąlygą ORDER BY su CASE sakiniu SQL:
Paimkime kitą lentelę Employee_Details, kurioje yra Emp_ID, Emp_Name, Emp_Dept ir Emp_Age.
Mes galime patikrinti Employee_Details duomenis naudodami šią užklausą SQL:
Select * From Employee_Details;
Išvestis:
Emp_Id | Emp_Name | Emp_Dept | Emp_Age |
---|---|---|---|
1 | Akshay | Finansai | 23 |
2 | Ram | Rinkodara | 24 |
3 | Balramas | Pardavimai | 25 |
4 | jatin | Kodavimas | 22 |
5 | Manoj | Rinkodara | 23 |
6 | Lapelis | Finansai | 24 |
7 | Plaukai | Finansai | 22 |
8 | Jogešas | Kodavimas | 25 |
9 | Naveenas | Rinkodara | 22 |
10 | Tarūnas | Finansai | 23 |
Ši SQL užklausa rodo visą informaciją apie darbuotojus didėjančia darbuotojų vardų tvarka:
santykio kompozicija
SELECT * FROM Employee_Details ORDER BY Emp_Name;
Išvestis:
Emp_Id | Emp_Name | Emp_Dept | Emp_Age |
---|---|---|---|
1 | Akshay | Finansai | 23 |
3 | Balramas | Pardavimai | 25 |
5 | Manoj | Rinkodara | 23 |
9 | Naveenas | Rinkodara | 22 |
7 | Plaukai | Finansai | 22 |
2 | Ram | Rinkodara | 24 |
6 | Lapelis | Finansai | 24 |
10 | Tarūnas | Finansai | 23 |
4 | jatin | Kodavimas | 22 |
8 | Jogešas | Kodavimas | 25 |
Jei norite viršuje rodyti tuos darbuotojus, kurie dirba kodavimo skyriuje, tai šiai operacijai CASE sakinyje turite naudoti vieną WHEN ir THEN sakinį, kaip parodyta šioje užklausoje:
SELECT * FROM Employee_Details ORDER BY CASE WHEN Emp_Dept = 'Coding' THEN 0 ELSE 1 END, Emp_Name;
Išvestis:
Emp_Id | Emp_Name | Emp_Dept | Emp_Age |
---|---|---|---|
4 | jatin | Kodavimas | 22 |
8 | Jogešas | Kodavimas | 25 |
1 | Akshay | Finansai | 23 |
3 | Balramas | Pardavimai | 25 |
5 | Manoj | Rinkodara | 23 |
9 | Naveenas | Rinkodara | 22 |
7 | Plaukai | Finansai | 22 |
2 | Ram | Rinkodara | 24 |
6 | Lapelis | Finansai | 24 |
10 | Tarūnas | Finansai | 23 |
60>