# دليل عملي لمنطق if else if في SQL باستخدام CASE و IF

> أتقن استخدام منطق if else if في SQL. يشرح دليلنا، من خلال أمثلة عملية، كيفية استخدام CASE وIF لتحويل البيانات في MySQL وSQL Server.

Source: https://www.electe.net/ar/%D8%A7%D9%84%D9%85%D9%86%D8%B4%D9%88%D8%B1/if-else-if-in-sql

Site guide: https://www.electe.net/ar/llms.txt

يتساءل كثيرون، المعتادون على لغات برمجة أخرى، عن كيفية إعادة إنتاج التعليمة الكلاسيكية `IF ELSE IF` في SQL. الجواب هو أن SQL لا يملك أمرًا مباشرًا بهذا الاسم، لكنه يقدم حلاً أكثر قوة وأناقة: تعبير **CASE WHEN**. هذا هو الحل القياسي والعالمي للتعامل مع الشروط المتعددة مباشرة داخل استعلاماتك. إلى جانب `CASE`، توفر بعض اللهجات مثل T-SQL وMySQL أيضًا اختصارات أكثر إيجازًا مثل `IIF()` و`IF()` للحالات الأبسط.

## لماذا تعتبر المنطق الشرطي قوة خارقة في لغة SQL

تخيل أنك تحتاج إلى تصنيف العملاء حسب مستويات الإنفاق، أو تحديد أولويات مختلفة لطلبات الدعم وفقًا لدرجة الاستعجال، أو تصنيف المنتجات حسب الموسمية. سترغب في القيام بكل ذلك مباشرةً من قاعدة البيانات، دون الحاجة إلى تصدير البيانات ومعالجتها في مكان آخر، أليس كذلك؟

هذه هي بالضبط قوة المنطق الشرطي في لغة SQL. إنها سطر البرمجة الذي يحول عملية استخراج البيانات البسيطة إلى تحليل أعمال حقيقي.

إن إتقان منطق "if else if" في لغة SQL هو مهارة تميز بين من يكتفي باستخراج البيانات ومن يجعلها تتحدث. في هذا الدليل، سنوضح لك كيفية تحويل استعلاماتك من مجرد قوائم من السجلات إلى أدوات للتحليل الديناميكي.

بدلاً من استخراج البيانات الأولية ثم معالجتها باستخدام Excel أو Python، ستتعلم:

- **إنشاء رؤى معقدة** مباشرة على مستوى قاعدة البيانات، مما يسرّع عملياتك.
- **كتابة كود SQL أنظف**، وأكثر قابلية للقراءة، وأكثر كفاءة بشكل ملحوظ.
- **الحصول على إجابات مفصّلة** بتعليمة واحدة قوية.

تتيح لك المنطق الشرطي دمج الذكاء التجاري مباشرةً في الاستعلام. فبدلاً من حساب المقاييس لاحقاً، تقوم بإنشائها أثناء استخراج البيانات. وهذا يجعل تحليلاتك أسرع وأكثر قابلية للتكرار وأكثر تكاملاً مع عملية اتخاذ القرار.

في نهاية هذا الدليل، ستكون قادرًا على تحويل البيانات إلى قرارات، مستفيدًا إلى أقصى حد من إمكانات قاعدة البيانات الخاصة بك. وتستخدم منصات مثل ELECTE، وهي منصة لتحليل البيانات مدعومة بالذكاء الاصطناعي مخصصة للشركات الصغيرة والمتوسطة، هذه المبادئ بالذات لأتمتة عملية إعداد التقارير، وتحويل الاستعلامات المعقدة إلى تصورات فورية توجه قرارات الأعمال.

إذا كان منطقك يتجاوز مجرد "إذا حدث هذا، افعل ذلك"، فإن تعبير **CASE** يصبح أداتك الأقوى والأكثر موثوقية في SQL. إنه ليس حيلة خاصة بلهجة معينة، بل هو المعيار ANSI-SQL للتعامل مع الشروط المتعددة. هذا يعني أن كودك سيعمل في كل مكان تقريبًا، من PostgreSQL إلى SQL Server.

فكّر في `CASE` على أنه شجرة قرار مُدمجة مباشرة في استعلامك. بدلاً من تكديس تعليمات `IF` معقدة واحدة داخل الأخرى، مما يجعل الكود سريعًا ما يصبح غير مقروء وكابوسًا في الصيانة، يتيح لك `CASE` سرد سلسلة من الشروط بطريقة نظيفة ومتسلسلة.

### حالة بسيطة مقابل حالة تم البحث عنها

يأتي تعبير `CASE` بنوعين، كل منهما مصمم لسيناريوهات محددة.

- **Simple CASE:** مثالي عندما تحتاج إلى إجراء مقارنات مباشرة للتساوي على عمود واحد. الصيغة مضغوطة ونظيفة، مثالية لتحويل قيم دقيقة، مثل تحويل رمز حالة رقمي (1، 2، 3) إلى تسميات نصية ("نشط"، "غير نشط"، "معلّق").
- **Searched CASE:** هنا تحصل على أقصى قدر من المرونة. كل شرط `WHEN` هو تعبير منطقي مستقل بذاته. يمكنك استخدام أعمدة متعددة، ومشغلات منطقية مثل `AND` و`OR`، ومقارنات معقدة (`>`، `<`، `<>`). هذا هو التجسيد الحقيقي لمنطق **if-else if في SQL**.

عمليًا، `Searched CASE` هو ما ستستخدمه في 90% من الحالات. إنه الأداة التي تتيح لك ترجمة قواعد عمل معقدة – مثل تقسيم العملاء بناءً على الإنفاق _و_ تكرار الشراء – مباشرة داخل استعلامك.

### أمثلة عملية في أهم لهجات لغة SQL

لنرَ كيفية استخدام `Searched CASE` لمهمة كلاسيكية: تصنيف المنتجات حسب السعر. ستلاحظ أن الصيغة متطابقة تقريبًا بين اللهجات الرئيسية، مما يثبت قابليتها المذهلة للنقل.

**مثال في MySQL/PostgreSQL/SQL Server:**

`SELECTnome_prodotto,prezzo,CASEWHEN prezzo > 1000 THEN 'Premium'WHEN prezzo > 100 AND prezzo <= 1000 THEN 'Fascia Media'ELSE 'Economico'END AS categoria_prezzoFROM Prodotti;`

ماذا يفعل هذا الكود؟ يحلل كل صف في جدول `Prodotti`. إذا تجاوز `prezzo` قيمة 1000، يُسند التسمية 'Premium'. إن لم يكن الأمر كذلك، ينتقل إلى الشرط التالي: يتحقق مما إذا كانت القيمة بين 100 و1000 لإسناد 'Fascia Media'. إذا لم يتحقق أي من الشرطين، تدخل جملة `ELSE` كحل احتياطي، مسندة 'Economico'.

شهد اعتماد `CASE` نموًا ملحوظًا في قطاع تكنولوجيا المعلومات الإيطالي. أظهر تحليل للسوق زيادة بنسبة **45%** في استخدام الاستعلامات المعقدة التي تعتمد على `CASE` من قبل الشركات الصغيرة والمتوسطة بين عامي 2020 و2025. كما كشف تقرير صادر عن ASSINT عام 2023 أن **68%** من المطورين الإيطاليين يفضلون `CASE` لأنه يقلل الأخطاء بنسبة **32%** مقارنة بالمنطق البديل الأكثر تعقيدًا. حتى في Electe، منصتنا لتحليل البيانات المدعومة بالذكاء الاصطناعي، تُعد هذه البنى أساسية لأتمتة التقارير، مما يقلص أوقات المعالجة بنسبة 60% لعملائنا.

لكن تعلّم استخدام `CASE` لا يقتصر على `SELECT`. يمكنك دمجه في جمل مثل `WHERE` و`ORDER BY` وحتى `GROUP BY` لإنشاء عوامل تصفية وترتيب وتجميعات ديناميكية، مما يجعل استعلاماتك أكثر ذكاءً ومرونة. إذا أردت التعمق أكثر، أنصحك باستكشاف [دليلنا المفصل عن CASE WHEN في SQL](https://www.electe.net/post/case-when-sql).

لمساعدتك في كتابة كود يعمل بسلاسة على قواعد بيانات مختلفة، قمنا بإعداد جدول يلخص الاختلافات النحوية الصغيرة ولكن الحاسمة بين لهجات SQL الأكثر شيوعًا.

### مقارنة بين صيغة CASE في أهم لهجات لغة SQL

الخاصيةMySQLSQL ServerPostgreSQLSearched CASE (`CASE WHEN ... END`)مدعوممدعوممدعومSimple CASE (`CASE col WHEN ... END`)مدعوممدعوممدعومدالة ثنائية بديلة`IF(cond, vero, falso)IIF(cond, vero, falso)`غير متوفرة، استخدم `CASE`إدارة الأنواع في فرعي `THEN`/`ELSE`مرنة، تحويل تلقائي للأنواعصارمة، أنواع متطابقة أو قابلة للتحويل ضمنيًاصارمة، أنواع متوافقة إلزاميةحذف جملة `ELSE`يُرجع `NULL`يُرجع `NULL`يُرجع `NULL`

تدعم جميع قواعد البيانات الثلاث — **MySQL**، و**SQL Server (T-SQL)**، و**PostgreSQL** — كلاً من CASE البحثي (Searched CASE) وCASE البسيط (Simple CASE) بنفس الصيغة القياسية: `CASE WHEN ... END`.

فيما يتعلق بـ**الدوال البديلة**، توفر MySQL الدالة `IF(cond, true, false)` بينما يوفر SQL Server الدالة `IIF(cond, true, false)`. أما PostgreSQL فلا يملك دالة مباشرة مكافئة لـ`IIF` ويتطلب استخدام `CASE` في كل موقف.

على صعيد **إدارة الأنواع**، تُعد MySQL الأكثر تساهلاً بين الثلاثة. أما SQL Server فهو أكثر تقييدًا: يجب أن تكون جميع النتائج في فرعي `THEN` و`ELSE` من نفس نوع البيانات أو قابلة للتحويل ضمنيًا. وPostgreSQL أيضًا تقييدي ويتطلب أنواع بيانات متوافقة بين جميع فروع `CASE`.

كما ترى، فإن بناء الجملة الأساسي متين وموحد. وتظهر الاختلافات بشكل أساسي في الوظائف البديلة وفي معالجة أنواع البيانات، وهو أمر لا ينبغي الاستهانة به عند كتابة استعلامات مخصصة للتشغيل على أنظمة متنوعة. إن أخذ هذه الفروق الدقيقة في الاعتبار سيوفر عليك الكثير من المتاعب.

## اختر IF و IIF للظروف الثنائية البسيطة

بالتأكيد، يُعد تعبير `CASE` بمثابة سكين الجيش السويسري للتعامل مع المنطق المعقد، لكن ماذا يحدث عندما يكون مفترق الطرق بسيطًا، خيارًا واضحًا بين احتمالين فقط؟ لهذه السيناريوهات من نوع "if-else" الصرف، توفر لك بعض لهجات SQL بدائل أكثر مباشرة وخفة.

تخيّلها كطرق مختصرة. بدلاً من بناء كتلة `CASE` كاملة فقط للتعامل مع نتيجتين، يمكنك استخدام دالة واحدة تجعل الكود أكثر إيجازًا، ولنكن صريحين، أسهل في القراءة من النظرة الأولى.

### دالة IF في MySQL

تطرح **MySQL** على الطاولة الدالة `IF()`، التي تفعل بالضبط ما تَعِد به: تقبل ثلاث وسائط ولا تطلب أكثر من ذلك.

1. الشرط المراد التحقق منه.
2. القيمة التي يجب إرجاعها إذا كان صحيحًا.
3. القيمة التي يجب إرجاعها إذا كان خاطئًا.

الصياغة نظيفة جدًا: `IF(condizione, valore_se_vero, valore_se_falso)`.

لنأخذ مثالاً عمليًا. تريد وضع علامة سريعة على مستخدمي منصتك كـ'نشط' أو 'غير نشط' بناءً على تاريخ آخر تسجيل دخول لهم. باستخدام `IF`، تنتهي المهمة بسرعة:

`SELECTnome_utente,IF(last_login > '2023-01-01', 'Attivo', 'Inattivo') AS stato_utenteFROM Utenti;`

لا شك أنها أكثر إيجازًا من `CASE` مكافئ. وعلى أي حال، بيانات القطاع واضحة: نما استخدام `IF(condition, true, false)` بنسبة **52%** بين الشركات المتوسطة الإيطالية منذ عام 2019.

إذا أردت التعمق أكثر، يمكنك الاطلاع على [مزيد من التفاصيل حول التعبيرات الشرطية في SQL](https://support.workiva.com/hc/it/articles/360042533552-Espressioni-condizionali-SQL).

### دالة IIF في SQL Server

لا يقف **SQL Server** مكتوف الأيدي، فهو يوفر دالة شبه مطابقة: `IIF()` (اختصار لـ_Immediate IF_). طريقة عملها هي نفسها `IF()` في MySQL، نفس المنطق، نفس الصياغة.

إذن، بالرجوع إلى المثال السابق، سنكتب بالنسبة لـ SQL Server:

`SELECTnome_utente,IIF(last_login > '2023-01-01', 'Attivo', 'Inattivo') AS stato_utenteFROM Utenti;`

هذا الرسم البياني التوضيحي يساعدك على تصور عملية اتخاذ القرار للاختيار بين `Simple CASE` و`Searched CASE` بناءً على نوع المقارنة التي تحتاج إلى تنفيذها.

الفكرة الأساسية بسيطة: إذا كنت تتحقق من قيمة واحدة للمساواة، فإن `Simple CASE` أكثر وضوحاً. لأي منطق آخر، `Searched CASE` هو الخيار الصحيح.

**متى تستخدم IF/IIF؟** استخدمها دون تردد للشروط الثنائية، الواضحة والبسيطة. لكن انتبه: بمجرد أن يبدأ منطقك في الحاجة إلى "elseif"، عد فوراً إلى `CASE`. إنه دائماً الخيار الأفضل للحفاظ على كود قابل للقراءة وسهل الصيانة مع مرور الوقت.

إن معرفة هذه البدائل المحددة لكل لهجة تتيح لك كتابة كود ليس صحيحًا فحسب، بل مُحسَّنًا أيضًا للمنصة التي تستخدمها. إنه التوازن المثالي بين القوة والبساطة.

## تطبيق المنطق الشرطي: أمثلة من الواقع

القوة الحقيقية للتعبيرات الشرطية في SQL تظهر عندما تطبقها على مشكلات عمل ملموسة. هنا تتحول النظرية إلى فعل. لنرَ كيف تتوقف `IF` و`ELSE` وخاصة `CASE WHEN` عن كونها مجرد أوامر بسيطة لتصبح أدوات قادرة على تحويل البيانات الخام إلى رؤى استراتيجية، مباشرة داخل قاعدة البيانات.

سنحلل أربعة سيناريوهات يواجهها كل محلل بيانات أو مطور عاجلاً أم آجلاً، من التسويق إلى إدارة البيانات، موضحين كيف يمكن لـ`CASE WHEN` منظمة جيداً أن تُؤتمت المهام المعقدة وتوفر إجابات فورية.

### التقسيم الديناميكي للعملاء

تخيل أنك تريد تصنيف عملائك لإطلاق حملات تسويقية أكثر فعالية. النهج التقليدي؟ تصدير كل شيء إلى جدول بيانات والبدء بالعبث بالمعادلات والفلاتر. لكن هناك طريقة أذكى بكثير: إنشاء شرائح ديناميكية مباشرة في استعلام `SELECT` الخاص بك.

تتيح لك هذه التقنية تصنيف كل عميل وفقًا لسلوكه الشرائي، مثل إجمالي الإنفاق أو تاريخ آخر طلب. وهي طريقة فعالة للغاية للتعرف بنظرة واحدة على أفضل العملاء، والعملاء المخلصين، والعملاء الذين قد يتركونك.

**مثال عملي:**

`SELECTID_Cliente,Nome,Spesa_Totale,Ultimo_Acquisto,CASEWHEN Spesa_Totale > 5000 AND Ultimo_Acquisto >= '2023-10-01' THEN 'Cliente Premium'WHEN Spesa_Totale > 1000 THEN 'Cliente Fedele'WHEN Ultimo_Acquisto < '2023-01-01' THEN 'Cliente a Rischio'ELSE 'Cliente Occasionale'END AS Segmento_ClienteFROM Clienti;`

باستعلام واحد فقط، تُثرى بياناتك بسياق أساسي لاستراتيجيات التسويق والاحتفاظ بالعملاء لديك. إنه أحد الركائز لبناء [مثال على قاعدة بيانات علائقية](https://www.electe.net/post/esempio-di-database) تكون مفيدة فعلاً للأعمال وليست مجرد أرشيف بيانات.

### تنظيف البيانات وتوحيدها

جودة البيانات هي كل شيء. بدون بيانات نظيفة، كل تحليل يكون عرضة للخطأ. للأسف، البيانات المُدخلة يدوياً غالباً ما تكون فوضى: غير متسقة، مليئة بأخطاء الكتابة أو منسقة بطرق مختلفة. استخدام المنطق الشرطي في جملة `UPDATE` يتيح لك تنظيف وتوحيد مجموعات بيانات كاملة بأمر واحد فقط.

هذا النهج ليس فقط أكثر كفاءة من التصحيح اليدوي لآلاف السجلات، بل إنه بمثابة منقذ حقيقي. فهو يضمن الاتساق ويجهز بياناتك لإجراء تحليلات موثوقة أخيرًا.

**مثال عملي:**

`UPDATE IndirizziSETStato = CASEWHEN Stato IN ('NY', 'New York', 'new-york') THEN 'New York'WHEN Stato IN ('CA', 'California', 'cali') THEN 'California'ELSE Stato -- Lascia invariati gli altri statiENDWHEREPaese = 'USA';`

### حساب المكافآت المعقدة

غالبًا ما يمثل حساب المكافآت المتغيرة معضلةً صعبة. فهو يعتمد على عوامل عديدة: أداء المبيعات، ومدة الخدمة، وتحقيق أهداف الفريق. وبدلاً من إدارة هذه القواعد المعقدة باستخدام برامج نصية خارجية أو، والأسوأ من ذلك، عبر برنامج Excel، يمكنك تضمينها في إجراء مخزّن SQL.

وهذا لا يقتصر على توحيد منطق الأعمال فحسب، بل يضمن أيضًا إجراء الحسابات بطريقة متسقة وآمنة، مما يقلل من مخاطر الأخطاء اليدوية ويضمن الشفافية.

Una stored procedure può prendere in input l'ID di un dipendente e restituire il bonus esatto, applicando una logica `if else if` complessa basata sui dati di performance che già vivono nel database.

**مثال منطقي (بلغة T-SQL):**

`CREATE PROCEDURE CalcolaBonusDipendente@ID_Dipendente INTASBEGINDECLARE @AnniServizio INT;DECLARE @VenditeAnnuali DECIMAL(10, 2);DECLARE @Bonus DECIMAL(10, 2);SELECT @AnniServizio = Anni_Servizio, @VenditeAnnuali = Vendite_2023FROM PerformanceDipendenti WHERE ID_Dipendente = @ID_Dipendente;IF @VenditeAnnuali > 100000SET @Bonus = @VenditeAnnuali * 0.10; -- 10% bonus per top performerELSE IF @VenditeAnnuali > 50000 AND @AnniServizio > 5SET @Bonus = @VenditeAnnuali * 0.07; -- 7% per senior con buone venditeELSESET @Bonus = @VenditeAnnuali * 0.05; -- 5% bonus standard-- Logica per aggiornare la tabella o restituire il valoreSELECT @Bonus AS Bonus_Calcolato;END;`

### إنشاء تقارير مرنة

وأخيرًا، يمكن للمنطق الشرطي أن يجعل تقاريرك ديناميكية بشكل مذهل. باستخدام `CASE` داخل دوال التجميع مثل `COUNT` أو `SUM`، يمكنك إنشاء مقاييس معقدة بمسح واحد فقط للجدول.

على سبيل المثال، يمكنك حساب عدد الطلبات في فئات مختلفة، وجمع المبيعات حسب المنطقة، وحساب إجمالي الطلبات المعلقة، كل ذلك في استعلام واحد. وهذا يغني عن إجراء استعلامات منفصلة لكل مقياس، مما يجعل نصوص التقارير أسرع بكثير وأسهل في الصيانة.

**مثال عملي:**

`SELECTCOUNT(CASE WHEN Stato = 'Spedito' THEN 1 END) AS Ordini_Spediti,COUNT(CASE WHEN Stato = 'In Attesa' THEN 1 END) AS Ordini_In_Attesa,SUM(CASE WHEN Regione = 'Nord' THEN Totale END) AS Vendite_Nord,SUM(CASE WHEN Regione = 'Sud' THEN Totale END) AS Vendite_SudFROM Ordini;`

## التعامل مع القيم NULL وتحسين الأداء

امتلاك منطق شرطي يعمل هو نصف المهمة فقط. ليكون فعالًا حقًا، يجب أن يكون أيضًا متينًا، وقبل كل شيء، سريعًا. من بين أكثر العقبات شيوعًا التي يمكن أن تدمر تحليلاتك هما التعامل مع القيم **NULL** والاستعلامات التي تستغرق وقتًا طويلًا جدًا للتنفيذ.

القيم NULL هي وحش غريب في SQL. أي مقارنة مباشرة مع `NULL` (مثل `colonna = NULL` أو `colonna <> NULL`) لا تُرجع صحيحًا ولا خاطئًا، بل حالة ثالثة: `UNKNOWN`. هذا السلوك الذي يبدو غير ضار يمكن أن يخلق ثقوبًا سوداء حقيقية في منطق `if else if in sql` الخاص بك، مستبعدًا صفوفًا كنت مقتنعًا بأنك تضمّها، ومشوّهًا نتائجك.

### التعامل مع القيم الفارغة بشكل استباقي

لتجنب الوقوع في هذا الفخ، الحل واحد فقط: التعامل مع قيم NULL بشكل صريح واستباقي. بدلًا من عبور أصابعك على أمل أن تكون البيانات نظيفة، يمكنك استخدام دوال محددة مباشرة داخل تعبيرات `CASE` أو `IF`.

أقوى سلاحين في ترسانتك هما `COALESCE` و`ISNULL`.

- `COALESCE(colonna, valore_default)`: هذه هي الدالة القياسية في معيار ANSI-SQL، مما يعني أنك ستجدها تقريبًا في كل مكان. تُرجع أول قيمة غير NULL تصادفها في قائمة الوسائط. إنها مثالية لاستبدال `NULL` فورًا بديل آمن، مثل صفر أو سلسلة نصية 'غير متوفر'، حتى قبل أن يدخل منطقك الشرطي حيز التنفيذ.
- `ISNULL(colonna, valore_default)`: نموذجية للهجات مثل [SQL Server](https://www.microsoft.com/it-it/sql-server)، تقوم أساسًا بنفس عمل `COALESCE` عند استخدام وسيطتين فقط. انتبه مع ذلك، لأن هناك فروقًا صغيرة لكنها مهمة في طريقة تعاملها مع أنواع البيانات.

بدمج هذه الدوال، يصبح منطقك محصنًا ضد `NULL`. بسيط وفعّال.

قد يُحدث اختيار الوظيفة المناسبة للتعامل مع القيم "NULL" فرقاً كبيراً من حيث قابلية نقل الكود والأداء.

### مقارنة بين وظائف معالجة القيم الفارغة

_دليل سريع للاختيار بين COALESCE وISNULL وNULLIF بناءً على لهجة SQL وحالة الاستخدام المحددة، مع أمثلة عملية._

**COALESCE** تُرجع أول قيمة غير NULL من قائمة الوسائط. إنها الدالة الأكثر مرونة وتنوعًا، مدعومة من جميع اللهجات الرئيسية: SQL Server وPostgreSQL وOracle وMySQL وSQLite. مثال نموذجي على استخدامها هو إرجاع أول بريد إلكتروني متاح بين البريد الوظيفي والبريد الشخصي وقيمة احتياطية: `SELECT COALESCE(email_lavoro, email_personale, 'Nessuna email') FROM utenti`.

**ISNULL** تستبدل قيمة NULL ببديل محدد. إنها أقل مرونة من COALESCE لأنها تقبل وسيطتين فقط، وهي متاحة حصريًا في SQL Server وT-SQL. مثال عملي هو إرجاع سعر القائمة عندما يكون السعر المخفض غائبًا: `SELECT ISNULL(prezzo_scontato, prezzo_listino) FROM prodotti`.

**NULLIF** تُرجع NULL إذا كان تعبيرين متساويين، وإلا تُرجع الأول. إنها مفيدة بشكل خاص لتجنب القسمة على صفر، وهي مدعومة من SQL Server وPostgreSQL وOracle وMySQL. مثال تمثيلي هو حساب المتوسط لكل طلب مع الحماية من القسمة على صفر: `SELECT vendite_totali / NULLIF(numero_ordini, 0) AS media_ordine FROM report`.

باختصار، `COALESCE` هي الخيار الأكثر أمانًا وقابلية للنقل في معظم الأحيان. استخدم `ISNULL` إذا كنت تعمل حصريًا على SQL Server وتفضل صياغتها، واحتفظ بـ`NULLIF` في متناول يدك لحالات محددة مثل منع الأخطاء الرياضية.

### تحسين أداء الاستعلامات الشرطية

يمكن للمنطق الشرطي، خاصة إذا كان مُقحمًا داخل جملة `WHERE`، أن يتحول إلى عائق حقيقي لاستعلاماتك. في الواقع، قد يمنع أحيانًا قاعدة البيانات من استخدام الفهارس المتاحة لديها، مما يجبرها على إجراء مسح كامل للجدول ويؤدي إلى إبطاء كل شيء.

الاستعلام لا يكون "مكتملًا" ما لم يكن سريعًا. تحسين شروط `CASE` ليس عملية اختيارية، بل جزء أساسي من كتابة كود SQL احترافي لا يُثقل النظام.

إليك بعض النصائح العملية لضمان أن تكون استعلاماتك صحيحة وسريعة في الوقت نفسه:

1. **رتّب شروط **`WHEN`** حسب الاحتمالية**: ضع دائمًا الشروط الأكثر تكرارًا في المقدمة. يتوقف محرك قاعدة البيانات عند أول شرط صحيح يجده. هذا التكتيك البسيط يمكن أن يقلل بشكل كبير من العمل الذي يتعين عليه القيام به، خاصة على الجداول الكبيرة جدًا.
2. **حافظ على بساطة التعبيرات**: حاول تجنب الدوال المعقدة أو الاستعلامات الفرعية داخل جمل `WHEN`. يجب تقييم كل صف، وكلما كان الشرط أكثر تعقيدًا، استغرق ذلك وقتًا أطول. البساطة تؤتي ثمارها دائمًا من حيث الأداء.
3. **انتبه لجملة **`WHERE`: هذه قاعدة ذهبية. تطبيق دالة على عمود مفهرس داخل جملة `WHERE` (على سبيل المثال، `WHERE YEAR(data_ordine) = 2023`) هو أحد أكثر الطرق شيوعًا "لقتل" الفهرس. من الأفضل بكثير الحفاظ على "نظافة" الأعمدة وتطبيق التحويلات على الجانب الأيمن من المقارنة، إن أمكن (`WHERE data_ordine >= '2023-01-01' AND data_ordine < '2024-01-01'`).

## من القول إلى الفعل: النقاط التي يجب أن تتذكرها بشأن منطق SQL

النظرية أمر أساسي، لكن الفوز يتحقق في الممارسة العملية. لتحويل المفاهيم إلى مهارات حقيقية، إليك النقاط التي يجب أن تأخذها بعين الاعتبار لكتابة كود شرطي ليس صحيحًا فحسب، بل فعالًا وسهل القراءة ومستعدًا لمواجهة المستقبل أيضًا.

- **اعتمد دائمًا على **`CASE`** من أجل قابلية النقل**. كونها المعيار ANSI-SQL، فهي اللغة المشتركة لقواعد البيانات. إذا كان منطقك يحتوي على أكثر من نتيجتين محتملتين، فإن `CASE` ليس خيارًا: إنه الاختيار الذي يجعل كودك متينًا ومستقلاً عن المنصة. إنه استثمار للمستقبل.
- **اختر **`IF`**/**`IIF`** فقط من أجل البساطة (وإن أمكن)**. هذه الدوال رائعة بفضل صياغتها المختصرة في الشروط الثنائية (صحيح/خاطئ). لكن بمجرد أن يتعقد المنطق وتحتاج إلى "وإلا إذا..."، تخلَّ عنها فورًا وعُد إلى وضوح وقابلية توسع `CASE`.
- **توقع دائمًا قيم **`NULL`. القيمة `NULL` غير المُعالجة يمكن أن تشوّه نتائجك. أدرج دائمًا معالجة صريحة باستخدام `COALESCE` أو فحوصات `IS NULL`. الأمر أشبه بربط حزام الأمان: ربما لن تحتاجه دائمًا، لكن عندما تحتاجه، فإنه ينقذك.
- **أدرج دائمًا **`ELSE`. حذف جملة `ELSE` في `CASE` أشبه بترك باب مفتوح أمام نتائج غير متوقعة (سيُرجع `NULL`). إضافة `ELSE` تجعل سلوك استعلامك متوقعًا وتحميك من المفاجآت غير السارة.
- **حسّن ترتيب الشروط**. ضع دائمًا الشروط الأكثر احتمالًا في بداية كتلة `CASE` الخاصة بك. يتوقف محرك SQL عند أول شرط يثبت أنه صحيح. على الجداول التي تحتوي على ملايين الصفوف، يمكن لهذا التكتيك البسيط أن يسرّع استعلاماتك بشكل ملحوظ.

بتطبيق هذه المبادئ باستمرار، لن تكتفي بكتابة الاستعلامات فحسب. بل ستكون بصدد تصميم [حل ذكاء أعمال](https://www.electe.net/post/software-business-intelligence) متين، قادر على الصمود أمام اختبار الزمن والبيانات غير الكاملة.

## الاستنتاجات: حوّل بياناتك إلى قرارات

لقد رأيت كيف أن SQL، رغم عدم وجود أمر `IF ELSE IF` مباشر، يوفر أدوات أكثر قوة ومرونة. تعبير `CASE WHEN` هو موردك الرئيسي، وهو معيار عالمي يتيح لك تنفيذ منطق أعمال معقد مباشرة داخل الاستعلامات. أما في الحالات الأبسط، فتوفر دوال مثل `IF` و`IIF` صياغة أكثر إيجازًا.

إن إتقان هذه التقنيات يعني تحويل البيانات من مجرد سجلات إلى رؤى استراتيجية، من خلال تصنيف العملاء وتنقية البيانات وإنشاء تقارير ديناميكية بطريقة تتسم بالكفاءة وقابلية التوسع.

أنت الآن جاهز لاتخاذ الخطوة التالية. لا تكتفِ باستجواب بياناتك، بل اجعلها تتحدث. ابدأ اليوم في تطبيق هذه المنطقيات الشرطية للحصول على إجابات أكثر ذكاءً واتخاذ قرارات تجارية أفضل.

هل أنت مستعد لتحويل بياناتك إلى ميزة تنافسية دون كتابة سطر واحد من الكود؟ [اكتشف كيف يمكن لـ Electe أن تمنح بياناتك معنى من خلال عرض تجريبي مجاني](https://www.electe.net).
