بيان الحالة والحالة المتداخلة في SQL Server: مثال T-SQL
⚡ ملخص ذكي
CASE هو تعبير شرطي في SQL Server يقوم بإرجاع قيمة بناءً على الشرط الأول الذي يتم تقييمه على أنه صحيح، ويوفر نماذج بسيطة ونماذج بحث بالإضافة إلى التداخل داخل IF…ELSE و UPDATE و ORDER BY.

نظرة عامة على القضية في الحياة الحقيقية!
ومرة أخرى، في الحياة الواقعية، نقوم بأفعال مختلفة تبعاً لنتائج الظروف المختلفة. ولتوضيح ذلك أكثر، انظر إلى المثال التالي:
- إذا كانت تذاكر الطيران أقل من 100 دولار، فسأزور لوس أنجلوس.
- إذا كانت أسعار تذاكر الطيران تتراوح بين 100 و 200 دولار، فسأزور نيويورك.
- إذا كانت أسعار تذاكر الطيران تتراوح بين 200 و 400 دولار، فسأزور أوروبا.
- وإلا، فسأفضل زيارة موقع سياحي قريب.
دعونا نفكر في تصنيف الشرط والفعل بشكل منفصل عن المثال أعلاه:
| الشروط – تذاكر الطيران | يتم تنفيذ الإجراءات فقط إذا كان الشرط صحيحًا |
| Less من $ 100 | قم بزيارة لوس أنجلوس |
| بين 100 دولار و 200 دولار | قم بزيارة نيويورك |
| بين 200 دولار و 400 دولار | زيارة أوروبا |
| لم يتم استيفاء أي من الشروط المذكورة أعلاه | مكان سياحي قريب |
في المثال أعلاه، نلاحظ أن نتيجة الشروط المختلفة تحدد إجراءً منفصلاً. على سبيل المثال، لن يقوم الزائر بزيارة نيويورك إلا إذا كان سعر تذكرة الطيران يتراوح بين 100 و200 دولار. وبالمثل، مرض التصلب العصبي المتعدد مزود توفر عبارة CASE أيضًا إمكانية تنفيذ عبارات T-SQL مختلفة بناءً على نتائج شروط مختلفة.
ما هو بيان الحالة في SQL Server؟
بيان الحالة في ملقم SQL هو امتداد لـ إذا كان غير ذلك على عكس عبارة IF…ELSE، التي تسمح بشرط واحد فقط كحد أقصى، تسمح عبارة CASE للمستخدم بتطبيق شروط متعددة لتنفيذ مجموعات مختلفة من الإجراءات في MS SQL. وتعيد قيمة مقابلة مرتبطة بالشرط الذي حدده المستخدم.
لنتعلم كيفية استخدام CASE في SQL وسنتناول مفهومها في الأقسام التالية. في لغة MS SQL، يوجد نوعان من عبارة CASE:
- حالة بسيطة
- حالة بحثت
حالة بسيطة
صيغة الحالة البسيطة
CASE <Case_Expression> WHEN Value_1 THEN Statement_1 WHEN Value_2 THEN Statement_2 . . WHEN Value_N THEN Statement_N [ELSE Statement_Else] END AS [ALIAS_NAME]
هنا:
- يشير المعامل Case_Expression إلى التعبير الذي سيتم مقارنته في النهاية بـ Value_1 و Value_2 وما إلى ذلك.
- تشير المعلمات Statement_1 و Statement_2… إلى العبارات التي سيتم تنفيذها إذا كانت Case_Expression = Value_1 و Case_Expression = Value_2 وهكذا.
- باختصار، الشرط هو ما إذا كانت Case_Expression = Value_N، والإجراء هو تنفيذ Statement_N إذا كانت النتيجة أعلاه TRUE.
- يُعدّ ALIAS_NAME اختياريًا، وهو الاسم المستعار المُعطى لنتيجة عبارة CASE في SQL Server. ويُستخدم غالبًا عند استخدام CASE في جملة SELECT في SQL Server.
قواعد للحالة البسيطة
- لا تسمح الحالة البسيطة إلا بفحص المساواة بين Case_Expression مع Value_1 و Value_N.
- تتم مقارنة تعبير الحالة بقيمة، بالترتيب، بدءًا من القيمة الأولى، أي القيمة 1. فيما يلي طريقة التنفيذ:
- إذا كان Case_Expression مكافئًا لـ Value_1، فسيتم تخطي المزيد من العبارات عندما...THEN، وسينتهي تنفيذ CASE على الفور.
- إذا لم تتطابق قيمة Case_Expression مع قيمة Value_1، تتم مقارنتها مع قيمة Value_2 للتحقق من التكافؤ. وتستمر هذه العملية حتى تجد قيمة مكافئة لها من بين القيم Value_1 و Value_2 وهكذا.
- إذا لم يتطابق أي شيء، ينتقل التحكم إلى عبارة ELSE، ويتم تنفيذ Statement_Else.
- آخر اختياري.
- إذا لم يكن ELSE موجودًا ولم تتطابق Case_Expression مع أي من القيم، فسيتم عرض NULL.
يوضح الرسم البياني أدناه مسار تنفيذ حالة بسيطة:
أمثلة
لنفترض أن لدينا جدولاً باسم 'Guru99' مع عمودين، Tutorial_ID و Tutorial_name، وأربعة صفوف، كما هو موضح أدناه. سنستخدم هذا 'Guruجدول 99 في الأمثلة التالية.
الاستعلام 1: حالة بسيطة مع خيار "لا يوجد شيء آخر".
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
النتيجة: يوضح الرسم البياني أدناه تدفق تنفيذ حالة بسيطة بدون أي شيء آخر.
الاستعلام الثاني: حالة بسيطة مع خيار ELSE
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
النتيجة: يوضح الرسم البياني أدناه تدفق تنفيذ حالة بسيطة مع عبارة ELSE.
حالة بحثت
صيغة البحث عن الحالة
CASE WHEN <Boolean_Expression_1> THEN Statement_1 WHEN <Boolean_Expression_2> THEN Statement_2 . . WHEN <Boolean_Expression_N> THEN Statement_N [ELSE Statement_Else] END AS [ALIAS_NAME]
هنا:
- يشير المعامل Boolean_Expression_1… إلى التعبير الذي سيتم تقييمه ليكون صحيحًا أو خاطئًا.
- تشير المعلمات Statement_1 و Statement_2… إلى العبارات التي سيتم تنفيذها إذا كانت نتيجة Boolean_Expression_1 و Boolean_Expression_2 المقابلة هي TRUE.
- باختصار، الشرط هو Boolean_Expression_1… والإجراء هو تنفيذ Statement_N إذا كان Boolean_Expression_1 أعلاه صحيحًا.
- يُعدّ ALIAS_NAME اختياريًا، وهو الاسم المستعار المُعطى لنتيجة عبارة CASE. ويُستخدم غالبًا عند استخدام CASE في جملة SELECT.
قواعد الحالة التي تم البحث فيها
- بخلاف الحالة البسيطة، فإن الحالة التي يتم البحث فيها لا تقتصر على فحص المساواة فقط، بل تسمح بتعبير منطقي.
- يتم تقييم التعبير المنطقي، بالتسلسل، بدءًا من التعبير المنطقي الأول، أي Boolean_Expression_1. فيما يلي طريقة التنفيذ:
- إذا كانت قيمة Boolean_Expression_1 صحيحة، فسيتم تخطي عبارات WHEN…THEN اللاحقة، وسينتهي تنفيذ CASE على الفور.
- إذا كانت قيمة التعبير المنطقي الأول (Boolean_Expression_1) خاطئة، فسيتم تقييم التعبير المنطقي الثاني (Boolean_Expression_2) للتحقق من صحته. وتستمر عملية تقييم التعبير المنطقي حتى يُرجع أحد التعبيرات المنطقية القيمة الصحيحة (TRUE).
- إذا لم يتطابق أي شيء، ينتقل التحكم إلى عبارة ELSE، ويتم تنفيذ Statement_Else.
- كما هو الحال في الحالة البسيطة، فإن عبارة ELSE اختيارية في الحالة التي تم البحث عنها أيضًا.
- إذا لم يكن ELSE موجودًا ولم تُرجع أي من التعبيرات المنطقية القيمة TRUE، فسيتم عرض NULL.
يوضح الرسم البياني أدناه مسار تنفيذ الحالة التي تم البحث عنها:
أمثلة
الاستعلام 1: حالة تم البحث فيها مع خيار "لا يوجد شيء آخر".
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
النتيجة: يوضح الرسم البياني أدناه مسار تنفيذ الحالة التي تم البحث عنها بدون أي شيء آخر.
الاستعلام الثاني: الحالة التي تم البحث عنها مع خيار ELSE
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
النتيجة: يوضح الرسم البياني أدناه تدفق تنفيذ الحالة التي تم البحث عنها مع ELSE.
الفرق بين أسلوب التنفيذ: SIMPLE و SEARCH CASE
دعونا نلقي نظرة على مثال الحالة البسيطة أدناه:
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
هنا، يُعدّ 'Tutorial_name' جزءًا من عبارة CASE في لغة SQL. ثم تتم مقارنة قيمة 'Tutorial_name' مع كل قيمة WHEN، أي 'SQL'... حتى تتطابق قيمة 'Tutorial_name' مع قيمة WHEN.
على العكس من ذلك، فإن مثال SEARCH CASE لا يحتوي على تعبير CASE:
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
هنا، تحتوي كل عبارة WHEN على تعبير منطقي شرطي خاص بها. يتم تقييم كل تعبير منطقي، مثل Tutorial_name = 'SQL'...، لتحديد ما إذا كان صحيحًا أم خاطئًا حتى يتم العثور على أول تعبير منطقي يُقيّم إلى صحيح.
الفرق بين الحالة البسيطة والحالة التي تم البحث عنها
| حالة بسيطة | حالة تم البحث فيها |
| تأتي الكلمة المفتاحية CASE متبوعة مباشرة بـ CASE_Expression وتأتي قبل عبارة WHEN.
على سبيل المثال: |
تتبع الكلمة المفتاحية CASE عبارة WHEN، ولا يوجد تعبير بين CASE و WHEN.
على سبيل المثال: |
| في الحالة البسيطة، توجد قيمة لكل عبارة WHEN. تُقارن هذه القيم (Value_1، Value_2، ...) بتعبير CASE_Expression واحد بالتسلسل. تُقيّم النتيجة للتحقق من صحة أو خطأ كل عبارة WHEN.
على سبيل المثال: |
في حالة البحث، يوجد تعبير منطقي لكل عبارة WHEN. تقوم هذه التعبيرات المنطقية (Boolean_Expression_1، Boolean_Expression_2، ...) بتقييم شرط الصواب/الخطأ لكل عبارة WHEN.
على سبيل المثال: |
| لا تدعم الحالة البسيطة سوى فحص المساواة، أي ما إذا كان CASE_Expression = VALUE_1، VALUE_2…
على سبيل المثال: |
باستخدام Boolean_Expression_N، تدعم حالة البحث أي عملية ينتج عنها قيمة منطقية. وتشمل هذه العملية عاملي المساواة وعدم المساواة.
على سبيل المثال: |
الحالة المتداخلة: الحالة في حالة وجود خلاف ذلك
يمكننا استخدام CASE داخل عبارة IF…ELSE. نقوم بتعريف متغير للحصول على تذكرة الطيران، قم بتقسيم الفرع بناءً على قيمتها. فيما يلي مثال على كود MS-SQL:
DECLARE @Flight_Ticket int; SET @Flight_Ticket = 190; IF @Flight_Ticket > 400 PRINT 'Visit Nearby Tourist Location'; ELSE BEGIN SELECT CASE WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles' WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York' WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe' END AS Location END
في المثال أعلاه، تم تضمين عبارة CASE داخل عبارة IF…ELSE. أولاً، يتم تنفيذ عبارة IF، وإذا كان شرط CASE في SQL Server خاطئًا، فسيتم تنفيذ عبارة ELSE. يحتوي جزء ELSE على عبارة CASE متداخلة في SQL. بناءً على قيمة تذكرة الطيران، يتم عرض إحدى النتائج التالية:
- يقوم النظام بطباعة عبارة "قم بزيارة موقع سياحي قريب" إذا كانت تذاكر الطيران تزيد عن 400 دولار.
- يقوم النظام بطباعة عبارة "قم بزيارة لوس أنجلوس" إذا كانت أسعار تذاكر الطيران تتراوح بين 0 و 100 دولار.
- يقوم النظام بطباعة عبارة "قم بزيارة نيويورك" إذا كانت أسعار تذاكر الطيران تتراوح بين 101 دولار و 200 دولار.
- يقوم النظام بطباعة عبارة "زيارة أوروبا" إذا كانت أسعار تذاكر الطيران تتراوح بين 201 دولارًا و 400 دولارًا.
تُظهر النتيجة أدناه الموقع الذي يتم إرجاعه عند تشغيل عبارة CASE المتداخلة داخل فرع ELSE:
حالة متداخلة: حالة داخل الحالة
يمكننا استخدام عبارة CASE داخل عبارة CASE أخرى في لغة SQL. فيما يلي مثال على كود MS-SQL:
DECLARE @Flight_Ticket int; SET @Flight_Ticket = 250; SELECT CASE WHEN @Flight_Ticket >= 400 THEN 'Visit Nearby Tourist Location.' WHEN @Flight_Ticket < 400 THEN CASE WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles' WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York' WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe' END END AS Location
في المثال أعلاه، تم تضمين عبارة CASE داخل عبارة CASE أخرى. ينفذ النظام عبارة CASE الخارجية أولاً؛ إذا كان سعر تذكرة الطيران أقل من 400 دولار، يتم تنفيذ عبارة CASE الداخلية. يتبع الموقع المُعاد نفس نطاقات التذاكر كما في المثال السابق، لذا فإن تذكرة بقيمة 250 دولارًا تقع ضمن النطاق من 201 إلى 400 دولار، وتُعيد خيار "زيارة أوروبا".
تُظهر النتيجة أدناه الموقع الذي تم إرجاعه بواسطة CASE الداخلي لتذكرة بقيمة 250 دولارًا:
حالة مع التحديث
لنفترض مجدداً أن لدينا 'Guruجدول 99' ذو عمودين وأربعة صفوف، كما هو موضح أدناه:
يمكننا استخدام CASE مع UPDATE. فيما يلي مثال لرمز MS-SQL:
UPDATE Guru99 SET Tutorial_Name = ( CASE WHEN Tutorial_Name = 'SQL' THEN 'Structured Query language.' WHEN Tutorial_Name = 'PL/SQL' THEN 'Oracle PL/SQL' WHEN Tutorial_Name = 'MSSQL' THEN 'Microsoft SQL.' WHEN Tutorial_Name = 'Hadoop' THEN 'Apache Hadoop.' END )
في المثال أعلاه، تُستخدم عبارة CASE في عبارة UPDATE. وبناءً على قيمة Tutorial_Name، يتم تحديث عمود Tutorial_Name بقيمة عبارة THEN.
- إذا كان Tutorial_Name = 'SQL'، فقم بتحديث Tutorial_Name إلى 'لغة الاستعلامات المهيكلة'.
- إذا كان Tutorial_Name = 'PL/SQL'، فقم بتحديث Tutorial_Name إلى 'Oracle PL/SQL'.
- إذا كان Tutorial_Name = 'MSSQL'، فقم بتحديث Tutorial_Name إلى 'Microsoft SQL'.
- إذا كان Tutorial_Name = 'Hadoop'، فقم بتحديث Tutorial_Name إلى 'Apache Hadoop'.
يؤدي تشغيل العبارة إلى تحديث الصفوف المطابقة، كما هو موضح أدناه:
دعونا نستفسر عنGuruجدول 99 للتحقق من القيم المحدثة:
حالة مع النظام من قبل
يمكننا استخدام عبارة CASE مع عبارة ORDER BY. فيما يلي مثال على كود MS-SQL:
Declare @Order Int; Set @Order = 1 Select * from Guru99 order by CASE WHEN @Order = 1 THEN Tutorial_ID WHEN @Order = 2 THEN Tutorial_Name END DESC
هنا، يُستخدم CASE مع ORDER BY. تم ضبط @Order على 1، وبما أن أول تعبير منطقي WHEN يُقيّم إلى TRUE، يتم اختيار Tutorial_ID لشرط ORDER BY. والنتيجة موضحة أدناه:
حقائق مثيرة للاهتمام!
- يمكن تضمين عبارة CASE داخل عبارة CASE أخرى وكذلك في عبارة IF…ELSE.
- بالإضافة إلى SELECT، يمكن استخدام CASE مع عبارات SQL أخرى مثل UPDATE و ORDER BY.













