logo

SQL CASE

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:

  1. KUR išlyga
  2. UŽSAKYMAS PAGAL punktą
  3. 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ų:

  1. Paprastas CASE teiginys
  2. 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 &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>

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 = &apos;Coding&apos; 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