ال قضية عبارة عن عبارة تعمل على نوع الاستعلامات المنطقية if-then-else. تقوم هذه العبارة بإرجاع القيمة عندما يتم تقييم الشرط المحدد إلى True. عندما لا يتم تقييم أي شرط إلى True، فإنه يُرجع قيمة الجزء ELSE.
عندما لا يكون هناك جزء ELSE ولا يتم تقييم أي شرط إلى True، فإنه يُرجع قيمة NULL.
في لغة الاستعلام الهيكلية، يتم استخدام عبارة CASE في عبارات SELECT وINSERT وDELETE مع البنود الثلاثة التالية:
- حيث الشرطية
- ترتيب حسب البند
- المجموعة حسب البند
يتبع هذا البيان في SQL دائمًا زوج واحد على الأقل من عبارات WHEN وTHEN وينتهي دائمًا بالكلمة الأساسية END.
عبارة 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.
أمثلة على بيان الحالة في SQL
لنأخذ جدول Student_Details، الذي يحتوي على رقم السجل والاسم والعلامات والموضوع ومدينة الطلاب.
لفة_رقم | Stu_Name | Stu_Subject | Stu_Marks | ستو_سيتي |
---|---|---|---|---|
2001 | أكشاي | علوم | 92 | نويدا |
2002 | كبش | الرياضيات | 49 | جايبور |
2004 | شيام | إنجليزي | 52 | جورجاون |
2005 | ياتين | لا | أربعة خمسة | لكناو |
2006 | مانوج | حاسوب | 70 | غازي آباد |
2007 | شيتال | الرياضيات | 82 | نويدا |
2008 | الشعر | علوم | 62 | جورجاون |
2009 | يوغيش | إنجليزي | 42 | لكناو |
2010 | كبش | حاسوب | 88 | دلهي |
2011 | شيام | لا | 35 | كانبور |
مثال 1: تستخدم عبارة SQL التالية شرط WHEN وTHEN المفرد لعبارة 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، فإنها ترجع Student_Passed وإلا ينتقل إلى آخر الجزء والعودة Student_Failed في ال Student_Result عمود.
انتاج:
لفة_رقم | Stu_Name | Stu_Subject | Stu_Marks | Student_Result |
---|---|---|---|---|
2001 | أكشاي | علوم | 92 | Student_Passed |
2002 | كبش | الرياضيات | 49 | Student_Failed |
2004 | شيام | إنجليزي | 52 | Student_Passed |
2005 | ياتين | لا | أربعة خمسة | Student_Failed |
2006 | مانوج | حاسوب | 70 | Student_Passed |
2007 | شيتال | الرياضيات | 82 | Student_Passed |
2008 | الشعر | علوم | 62 | Student_Passed |
2009 | يوغيش | إنجليزي | 42 | Student_Failed |
2010 | كبش | حاسوب | 88 | Student_Passed |
2011 | شيام | لا | 35 | Student_Failed |
مثال 2: تضيف عبارة SQL التالية أكثر من شرط WHEN وTHEN إلى عبارة CASE:
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_Dept | كامل الراتب | Emp_Remarks |
---|---|---|---|---|
1 | أكشاي | تمويل | 17000 | زيادة راتب |
2 | كبش | تسويق | 9000 | إنقاص |
3 | شيام | مبيعات | 10000 | زيادة راتب |
4 | ياتين | الترميز | 12000 | زيادة راتب |
5 | مانوج | تسويق | 8000 | إنقاص |
مثال 4: في هذا المثال، نستخدم عبارة ORDER BY مع عبارة CASE في SQL:
لنأخذ جدول 'تفاصيل_الموظف' آخر والذي يحتوي على Emp_ID وEmp_Name وEmp_Dept وEmp_Age.
خرائط جافا
يمكننا التحقق من بيانات Staff_Details باستخدام الاستعلام التالي في SQL:
Select * From Employee_Details;
انتاج:
Emp_Id | اسم_الوظيفة | Emp_Dept | Emp_Age |
---|---|---|---|
1 | أكشاي | تمويل | 23 |
2 | كبش | تسويق | 24 |
3 | بالرام | مبيعات | 25 |
4 | ياتين | الترميز | 22 |
5 | مانوج | تسويق | 23 |
6 | شيتال | تمويل | 24 |
7 | الشعر | تمويل | 22 |
8 | يوغيش | الترميز | 25 |
9 | نافين | تسويق | 22 |
10 | تارون | تمويل | 23 |
يوضح استعلام SQL التالي جميع تفاصيل الموظفين بالترتيب التصاعدي لأسماء الموظفين:
SELECT * FROM Employee_Details ORDER BY Emp_Name;
انتاج:
Emp_Id | اسم_الوظيفة | Emp_Dept | Emp_Age |
---|---|---|---|
1 | أكشاي | تمويل | 23 |
3 | بالرام | مبيعات | 25 |
5 | مانوج | تسويق | 23 |
9 | نافين | تسويق | 22 |
7 | الشعر | تمويل | 22 |
2 | كبش | تسويق | 24 |
6 | شيتال | تمويل | 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_Dept | Emp_Age |
---|---|---|---|
4 | ياتين | الترميز | 22 |
8 | يوغيش | الترميز | 25 |
1 | أكشاي | تمويل | 23 |
3 | بالرام | مبيعات | 25 |
5 | مانوج | تسويق | 23 |
9 | نافين | تسويق | 22 |
7 | الشعر | تمويل | 22 |
2 | كبش | تسويق | 24 |
6 | شيتال | تمويل | 24 |
10 | تارون | تمويل | 23 |
60>