الشرط CASE في SQL
< SQL
تستخدم لاختبار شرط معين بشكل مشابه لتعليمات if/else في لغات البرمجة الأخرى لتعيد أحد التعابير الممكنة، وتكون البنية العامة لها بالشكل الآتي:
CASE WHEN condition THEN result
[WHEN ...]
[ELSE result]
END
إذ تعبر الكلمة condition عن الشرط المُختبَر، وكلمة result عن التعبير المُعاد.
مثال
ليكن الجدول الآتي students موجودًا في قاعدة البيانات:
| GPA | Age | Name | StudentID |
|---|---|---|---|
| 3.68 | 25 | Mona | 1024 |
| 3.57 | 24 | Radi | 1081 |
| 2.50 | 25 | Leen | 1012 |
| 4.00 | 26 | Sarah | 1085 |
| 1.96 | 22 | Amin | 1066 |
| 2.87 | 23 | Yusuf | 1056 |
إن تنفيذ استعلام SELECT الآتي:
SELECT Name, Result =
CASE
WHEN GPA = 4 THEN 'A+'
WHEN GPA > 3.7 THEN 'A'
WHEN GPA > 3.3 THEN 'A-'
WHEN GPA > 3 THEN 'B+'
WHEN GPA > 2.7 THEN 'B'
WHEN GPA > 2.3 THEN 'B-'
WHEN GPA > 2 THEN 'C+'
WHEN GPA > 1.7 THEN 'C'
WHEN GPA > 1.3 THEN 'C-'
WHEN GPA > 1 THEN 'D+'
WHEN GPA > 0 THEN 'D'
ELSE 'F'
END
FROM students;
سيظهر الأحرف التقييميّة بحسب القيمة الموجودة في عمود GPA وذلك بالاعتماد على الشرط المُختبَر في حالات CASE، لتظهر النتائج الآتية:
| Result | Name |
|---|---|
| B+ | Mona |
| B+ | Radi |
| C+ | Leen |
| A+ | Sarah |
| C- | Amin |
| B- | Yusuf |
استخدام CASE مع العبارة ORDER BY
يمكن تحديد الترتيب ضمن عبارة ORDER BY وفقًا لشرط محدد وذلك باستخدام الكلمات المفتاحية CASE و WHEN و THEN و END.
مثال
إن كان الجدول الآتي rivers موجودًا في قاعدة البيانات:
| Continent | Outflow | LengthMiles | LengthKm | River | Serial |
|---|---|---|---|---|---|
| South America | Atlantic Ocean | 4345 | 6992 | Amazon | 1 |
| Africa | Mediterranean | 4258 | 6853 | Nile | 2 |
| North America | Gulf of Mexico | 3902 | 6275 | Mississippi | 3 |
| Asia | Bohai Sea | 3395 | 5464 | Yellow River | 4 |
| Africa | Atlantic Ocean | 2922 | 4700 | Congo | 5 |
| Asia | Laptev Sea | 2736 | 4400 | Lena | 6 |
| Africa | Gulf of Guinea | 2611 | 4200 | Niger | 7 |
| Europe | Caspian Sea | 2266 | 3645 | Volga | 8 |
| Asia | Andaman Sea | 1901 | 3060 | Salween | 9 |
لترتيب السجلات وفقًا لأطوالها في قارة Africa ووفقًا لأسمائها في القارات البقية، يُنفذ الاستعلام الآتي:
SELECT *
FROM rivers
ORDER BY
CASE Country
WHEN 'Africa' THEN length
ELSE Name
END;
وستظهر النتائج الآتية:
| Continent | LengthKm | River |
|---|---|---|
| Africa | 4200 | Niger |
| Africa | 4700 | Congo |
| Africa | 6853 | Nile |
| Asia | 4400 | Lena |
| Asia | 3060 | Salween |
| Asia | 5464 | Yellow River |
| Europe | 3645 | Volga |
| North America | 6275 | Mississippi |
| South America | 6992 | Amazon |
التوافقية
| SQLServer | SQLite | Oracle | PostgreSQL | MySQL |
|---|---|---|---|---|
| نعم | نعم | نعم | نعم | نعم |