الشرط 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 |
---|---|---|---|---|
نعم | نعم | نعم | نعم | نعم |