ה מקרה היא הצהרה שמפעילה שאילתות לוגיות מסוג if-אז-else. הצהרה זו מחזירה את הערך כאשר התנאי שצוין מוערך ל-True. כאשר אף תנאי אינו מוערך כ-True, הוא מחזיר את הערך של החלק ELSE.
כאשר אין חלק ELSE ואין תנאי מוערך כ-True, הוא מחזיר ערך NULL.
ב-Structured Query Language, הצהרת CASE משמשת בהצהרות SELECT, INSERT ו-DELETE עם שלושת הסעיפים הבאים:
javascript
- סעיף איפה
- הזמנה לפי סעיף
- GROUP BY סעיף
המשפט הזה ב-SQL תמיד מלווה לפחות זוג אחד של משפטים WHEN ו-THEN ותמיד מסתיים במילת המפתח END.
הצהרת CASE היא משני סוגים במסדי נתונים יחסיים:
- הצהרת CASE פשוטה
- חיפשתי בהצהרת CASE
תחביר של משפט CASE ב-SQL
CASE WHEN condition_1 THEN statement_1 WHEN condition_2 THEN statement_2 ……. WHEN condition_N THEN statement_N ELSE result END;
כאן, הצהרת CASE מעריכה כל תנאי אחד לאחד.
אם הביטוי תואם את התנאי של פסקת WHEN הראשונה, הוא מדלג על כל התנאים הנוספים של WHEN ו-THEN ומחזיר את המשפט_1 בתוצאה.
אם הביטוי אינו תואם לתנאי WHEN הראשון, הוא משווה לתנאי WHEN השניות. תהליך ההתאמה הזה יימשך עד להתאמה של הביטוי לכל תנאי WHEN.
אם שום תנאי לא תואם לביטוי, הפקד עובר אוטומטית לחלק ELSE ומחזיר את התוצאה שלו. בתחביר CASE, החלק ELSE הוא אופציונלי.
בתחביר, CASE ו-END הן מילות המפתח החשובות ביותר שמציגות את ההתחלה והסיום של הצהרת CASE.
דוגמאות להצהרת CASE ב-SQL
ניקח את הטבלה Student_Details, המכילה roll_no, שם, סימנים, נושא ועיר התלמידים.
רול_לא | Stu_Name | Stu_Subject | Stu_Marks | Stu_City |
---|---|---|---|---|
2001 | אקשיי | מַדָע | 92 | נוידה |
2002 | RAM | מתמטיקה | 49 | ג'איפור |
2004 | שיאם | אנגלית | 52 | גורגאון |
2005 | יאטין | לא | ארבע חמש | מזל |
2006 | Manoj | מַחשֵׁב | 70 | גאזיאבאד |
2007 | Sheetal | מתמטיקה | 82 | נוידה |
2008 | השיער | מַדָע | 62 | גורגאון |
2009 | יוג'ש | אנגלית | 42 | מזל |
2010 | RAM | מַחשֵׁב | 88 | דלהי |
2011 | שיאם | לא | 35 | קאנפור |
דוגמה 1: משפט ה-SQL הבא משתמש בתנאי WHEN ו-DAN בודדים למשפט 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;
הסבר לשאילתה למעלה:
כאן, הצהרת CASE בודקת שאם ה Stu_Marks גדול מ-50 ושווה ל-50, הוא מחזיר סטודנט_עבר אחרת עובר ל- אַחֵר חלק וחוזר תלמיד_נכשל בתוך ה Student_Result טור.
תְפוּקָה:
רול_לא | Stu_Name | Stu_Subject | Stu_Marks | Student_Result |
---|---|---|---|---|
2001 | אקשיי | מַדָע | 92 | סטודנט_עבר |
2002 | RAM | מתמטיקה | 49 | תלמיד_נכשל |
2004 | שיאם | אנגלית | 52 | סטודנט_עבר |
2005 | יאטין | לא | ארבע חמש | תלמיד_נכשל |
2006 | Manoj | מַחשֵׁב | 70 | סטודנט_עבר |
2007 | Sheetal | מתמטיקה | 82 | סטודנט_עבר |
2008 | השיער | מַדָע | 62 | סטודנט_עבר |
2009 | יוג'ש | אנגלית | 42 | תלמיד_נכשל |
2010 | RAM | מַחשֵׁב | 88 | סטודנט_עבר |
2011 | שיאם | לא | 35 | תלמיד_נכשל |
דוגמה 2: הצהרת SQL הבאה מוסיפה יותר מתנאי WHEN ו-DAN אחד למשפט CASE:
מחרוזת תאריך java
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>
תְפוּקָה:
Emp_Id | Emp_Name | Emp_Dept | סך_משכורת | Emp_Remarks |
---|---|---|---|---|
1 | אקשיי | לְמַמֵן | 17,000 | תוֹסֶפֶת |
2 | RAM | שיווק | 9000 | ירידה |
3 | שיאם | מכירות | 10000 | תוֹסֶפֶת |
4 | יאטין | סִמוּל | 12000 | תוֹסֶפֶת |
5 | Manoj | שיווק | 8000 | ירידה |
דוגמה 4: בדוגמה זו, אנו משתמשים בסעיף ORDER BY עם משפט CASE ב-SQL:
בואו ניקח עוד טבלה Employee_Details שמכילה Emp_ID, Emp_Name, Emp_Dept ו-Emp_Age.
אנו יכולים לבדוק את הנתונים של Employee_Details באמצעות השאילתה הבאה ב-SQL:
Select * From Employee_Details;
תְפוּקָה:
Emp_Id | Emp_Name | Emp_Dept | Emp_Age |
---|---|---|---|
1 | אקשיי | לְמַמֵן | 23 |
2 | RAM | שיווק | 24 |
3 | באלרם | מכירות | 25 |
4 | יאטין | סִמוּל | 22 |
5 | Manoj | שיווק | 23 |
6 | Sheetal | לְמַמֵן | 24 |
7 | השיער | לְמַמֵן | 22 |
8 | יוג'ש | סִמוּל | 25 |
9 | נאווין | שיווק | 22 |
10 | טארון | לְמַמֵן | 23 |
שאילתת SQL הבאה מציגה את כל הפרטים של העובדים בסדר עולה של שמות העובדים:
SELECT * FROM Employee_Details ORDER BY Emp_Name;
תְפוּקָה:
Emp_Id | Emp_Name | Emp_Dept | Emp_Age |
---|---|---|---|
1 | אקשיי | לְמַמֵן | 23 |
3 | באלרם | מכירות | 25 |
5 | Manoj | שיווק | 23 |
9 | נאווין | שיווק | 22 |
7 | השיער | לְמַמֵן | 22 |
2 | RAM | שיווק | 24 |
6 | Sheetal | לְמַמֵן | 24 |
10 | טארון | לְמַמֵן | 23 |
4 | יאטין | סִמוּל | 22 |
8 | יוג'ש | סִמוּל | 25 |
אם ברצונך להציג את העובדים בחלק העליון שעובדים במחלקת הקידוד, אז עבור פעולה זו, עליך להשתמש במשפט WHEN ו-THEN בודדים במשפט CASE כפי שמוצג בשאילתה הבאה:
SELECT * FROM Employee_Details ORDER BY CASE WHEN Emp_Dept = 'Coding' THEN 0 ELSE 1 END, Emp_Name;
תְפוּקָה:
Emp_Id | Emp_Name | Emp_Dept | Emp_Age |
---|---|---|---|
4 | יאטין | סִמוּל | 22 |
8 | יוג'ש | סִמוּל | 25 |
1 | אקשיי | לְמַמֵן | 23 |
3 | באלרם | מכירות | 25 |
5 | Manoj | שיווק | 23 |
9 | נאווין | שיווק | 22 |
7 | השיער | לְמַמֵן | 22 |
2 | RAM | שיווק | 24 |
6 | Sheetal | לְמַמֵן | 24 |
10 | טארון | לְמַמֵן | 23 |
60>