The SPRAWA to instrukcja obsługująca zapytania logiczne typu if-then-else. Ta instrukcja zwraca wartość, gdy określony warunek ma wartość True. Jeśli żaden warunek nie ma wartości True, zwraca wartość części ELSE.
Jeśli nie ma części ELSE i żaden warunek nie ma wartości True, zwracana jest wartość NULL.
W Strukturalnym Języku Zapytań instrukcja CASE jest używana w instrukcjach SELECT, INSERT i DELETE z następującymi trzema klauzulami:
- GDZIE Klauzula
- ZAMÓW PRZEZ klauzulę
- GRUPUJ WEDŁUG klauzuli
Po tej instrukcji SQL zawsze następuje co najmniej jedna para instrukcji WHEN i THEN i zawsze kończy się słowem kluczowym END.
W relacyjnych bazach danych instrukcja CASE jest dwojakiego rodzaju:
Java inaczej, jeśli
- Prosta instrukcja CASE
- Przeszukiwana instrukcja CASE
Składnia instrukcji CASE w SQL
CASE WHEN condition_1 THEN statement_1 WHEN condition_2 THEN statement_2 ……. WHEN condition_N THEN statement_N ELSE result END;
Tutaj instrukcja CASE ocenia każdy warunek jeden po drugim.
Jeśli wyrażenie pasuje do warunku pierwszej klauzuli WHEN, pomija wszystkie dalsze warunki WHEN i THEN i w wyniku zwraca instrukcję_1.
Jeśli wyrażenie nie pasuje do pierwszego warunku WHEN, porównuje się je z drugim warunkiem WHEN. Ten proces dopasowywania będzie kontynuowany do momentu dopasowania wyrażenia do dowolnego warunku WHEN.
Jeżeli żaden warunek nie jest dopasowany do wyrażenia, sterowanie automatycznie przechodzi do części ELSE i zwraca wynik. W składni CASE część ELSE jest opcjonalna.
W składni CASE i END są najważniejszymi słowami kluczowymi, które pokazują początek i zakończenie instrukcji CASE.
zmienna typu Java
Przykłady instrukcji CASE w SQL
Weźmy tabelę Student_Details, która zawiera roll_no, imię i nazwisko, oceny, przedmiot i miasto studentów.
Nr rolki | Stu_Nazwa | Stu_Temat | Stu_Marks | Stu_Miasto |
---|---|---|---|---|
2001 | Akshay | Nauka | 92 | Noida |
2002 | Baran | Matematyka | 49 | Jaipur |
2004 | Shyam | język angielski | 52 | Gurgaona |
2005 | Yatin | Nie | Cztery pięć | Lucknow |
2006 | Manoj | Komputer | 70 | Ghaziabad |
2007 | Arkusz | Matematyka | 82 | Noida |
2008 | Włosy | Nauka | 62 | Gurgaona |
2009 | Jogesz | język angielski | 42 | Lucknow |
2010 | Baran | Komputer | 88 | Delhi |
2011 | Shyam | Nie | 35 | Kanpur |
Przykład 1: W poniższej instrukcji SQL zastosowano pojedynczy warunek WHEN i THEN w połączeniu z instrukcją 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;
Wyjaśnienie powyższego zapytania:
Tutaj instrukcja CASE sprawdza, czy jeśli Stu_Marks jest większa i równa 50, zwracana jest wartość Student_Zaliczony w przeciwnym razie przechodzi do W PRZECIWNYM RAZIE część i wraca Student_Niepowodzenie w Wynik_ucznia kolumna.
wydrukuj z Javy
Wyjście:
Nr rolki | Stu_Nazwa | Stu_Temat | Stu_Marks | Wynik_ucznia |
---|---|---|---|---|
2001 | Akshay | Nauka | 92 | Student_Zaliczony |
2002 | Baran | Matematyka | 49 | Student_Niepowodzenie |
2004 | Shyam | język angielski | 52 | Student_Zaliczony |
2005 | Yatin | Nie | Cztery pięć | Student_Niepowodzenie |
2006 | Manoj | Komputer | 70 | Student_Zaliczony |
2007 | Arkusz | Matematyka | 82 | Student_Zaliczony |
2008 | Włosy | Nauka | 62 | Student_Zaliczony |
2009 | Jogesz | język angielski | 42 | Student_Niepowodzenie |
2010 | Baran | Komputer | 88 | Student_Zaliczony |
2011 | Shyam | Nie | 35 | Student_Niepowodzenie |
Przykład 2: Następująca instrukcja SQL dodaje do instrukcji CASE więcej niż jeden warunek WHEN i 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>
Wyjście:
Emp_Id | Nazwa_emplu | Emp_Dept | Całkowite wynagrodzenie | Emp_Uwagi |
---|---|---|---|---|
1 | Akshay | Finanse | 17000 | Przyrost |
2 | Baran | Marketing | 9000 | Zmniejszenie |
3 | Shyam | Obroty | 10000 | Przyrost |
4 | Yatin | Kodowanie | 12000 | Przyrost |
5 | Manoj | Marketing | 8000 | Zmniejszenie |
Przykład 4: W tym przykładzie używamy klauzuli ORDER BY z instrukcją CASE w języku SQL:
Weźmy inną tabelę Employee_Details, która zawiera Emp_ID, Emp_Name, Emp_Dept i Emp_Age.
Dane Employee_Details możemy sprawdzić za pomocą następującego zapytania w SQL:
Select * From Employee_Details;
Wyjście:
Emp_Id | Nazwa_emplu | Emp_Dept | Emp_Age |
---|---|---|---|
1 | Akshay | Finanse | 23 |
2 | Baran | Marketing | 24 |
3 | Balrama | Obroty | 25 |
4 | Yatin | Kodowanie | 22 |
5 | Manoj | Marketing | 23 |
6 | Arkusz | Finanse | 24 |
7 | Włosy | Finanse | 22 |
8 | Jogesz | Kodowanie | 25 |
9 | Naveen | Marketing | 22 |
10 | Tarun | Finanse | 23 |
Poniższe zapytanie SQL wyświetla wszystkie szczegóły pracowników w kolejności rosnącej według imion i nazwisk pracowników:
długość tablicy Java
SELECT * FROM Employee_Details ORDER BY Emp_Name;
Wyjście:
Emp_Id | Nazwa_emplu | Emp_Dept | Emp_Age |
---|---|---|---|
1 | Akshay | Finanse | 23 |
3 | Balrama | Obroty | 25 |
5 | Manoj | Marketing | 23 |
9 | Naveen | Marketing | 22 |
7 | Włosy | Finanse | 22 |
2 | Baran | Marketing | 24 |
6 | Arkusz | Finanse | 24 |
10 | Tarun | Finanse | 23 |
4 | Yatin | Kodowanie | 22 |
8 | Jogesz | Kodowanie | 25 |
Jeśli chcesz pokazać tych pracowników na górze, którzy pracują w Dziale Kodowania, to dla tej operacji musisz użyć pojedynczej instrukcji WHEN i THEN w instrukcji CASE, jak pokazano w poniższym zapytaniu:
SELECT * FROM Employee_Details ORDER BY CASE WHEN Emp_Dept = 'Coding' THEN 0 ELSE 1 END, Emp_Name;
Wyjście:
Emp_Id | Nazwa_emplu | Emp_Dept | Emp_Age |
---|---|---|---|
4 | Yatin | Kodowanie | 22 |
8 | Jogesz | Kodowanie | 25 |
1 | Akshay | Finanse | 23 |
3 | Balrama | Obroty | 25 |
5 | Manoj | Marketing | 23 |
9 | Naveen | Marketing | 22 |
7 | Włosy | Finanse | 22 |
2 | Baran | Marketing | 24 |
6 | Arkusz | Finanse | 24 |
10 | Tarun | Finanse | 23 |
60>