COALESCE وNULLIF وISNULL
استبدال القيم الافتراضية والفرق بين COALESCE والدوال الخاصة بكل مورّد
COALESCE وNULLIF وISNULL درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
استبدال القيم بـ NULL
بعد أن أصبح بإمكانكم اكتشاف NULL، تتمثل المهارة التالية في المقابلات في استبداله بقيمة افتراضية مناسبة. والأداة القياسية القابلة للنقل لهذا الغرض هي COALESCE.
ستتعرّفون أيضًا إلى NULLIF، الذي يعمل في الاتجاه المعاكس بتحويل قيمة محددة إلى NULL، وإلى دالتي المورّد ISNULL في SQL Server وIFNULL في MySQL، اللتين يخلط المرشحون بينهما وبين COALESCE كثيرًا.
إن معرفة الفروق الدقيقة بينها، وخصوصًا في عدد الوسائط ونوع القيمة المعادة، من الأسئلة الشائعة في الفرز.
أساسيات COALESCE
تأخذ COALESCE أي عدد من الوسائط، وتُرجع أول قيمة ليست NULL بعد فحص القيم من اليسار إلى اليمين. وإذا كانت جميع الوسائط NULL، فإنها تُرجع NULL.
إنها معيار ANSI وتعمل مع جميع قواعد البيانات الرئيسية، ولذلك ينبغي أن تكون إجابتكم الافتراضية. استخدموها لتوفير قيم بديلة للعرض أو الحساب أو التجميع.
-- Show 0 instead of NULL for missing bonuses
SELECT name, COALESCE(bonus, 0) AS bonus
FROM employees;
-- Multiple fallbacks, first non-NULL wins
SELECT COALESCE(mobile_phone, home_phone, 'no phone') AS contact
FROM customers;COALESCE تستخدم التقييم القصير
من النقاط الدقيقة التي يختبرها القائمون بالمقابلات أن COALESCE تقيّم الوسائط، من الناحية المفاهيمية، من اليسار إلى اليمين وتتوقف عند أول قيمة ليست NULL. لذلك لا تكون هناك حاجة إلى تعبير لاحق ومكلف بمجرد أن تحسم قيمة سابقة النتيجة.
عمليًا، قد تظل المحسّنات تقيّم التعبيرات بشكل استباقي في بعض المحركات، لذا لا تعتمدوا عليها للحماية من أخطاء مثل القسمة على صفر. لكن أولوية القيمة الفائزة من اليسار إلى اليمين مضمونة.
-- Prefer the manual override, else the computed value,
-- else a constant default
SELECT COALESCE(manual_price, list_price * 1.1, 9.99) AS price
FROM products;COALESCE ونوع البيانات الناتج
إليكم نقطة دقيقة قد تسبب مشكلة: يحدد ترتيب أولوية أنواع جميع الوسائط مجتمعة نوع بيانات نتيجة COALESCE، وليس الوسيطة الأولى فقط. وقد يؤدي خلط الأنواع غير المتوافقة إلى أخطاء أو اقتطاع غير متوقع.
فعلى سبيل المثال، قد يفشل استخدام COALESCE على عمود من نوع عدد صحيح وقيمة افتراضية نصية، أو قد يحدث تحويل ضمني للنوع، وذلك بحسب المحرك. ويستخدم القائمون بالمقابلات هذا الاختبار لمعرفة ما إذا كنتم تراعون الأنواع.
-- Risky: integer column with a string fallback
-- may error or force a cast depending on dialect
SELECT COALESCE(score, 'N/A') FROM tests;
-- Safer: keep the fallback type-compatible, or cast explicitly
SELECT COALESCE(CAST(score AS VARCHAR), 'N/A') FROM tests;ISNULL (SQL Server) مقابل COALESCE
يحتوي SQL Server على ISNULL(expr, replacement). تبدو هذه الدالة مشابهة لـ COALESCE، لكنها تختلف عنها بطرق مهمة يحب القائمون بالمقابلات المقارنة بينها:
- عدد الوسائط: تأخذ ISNULL وسيطين بالضبط، بينما تأخذ COALESCE عددًا كبيرًا من الوسائط.
- نوع القيمة المعادة: تستخدم ISNULL نوع الوسيطة الأولى، مما قد يؤدي إلى اقتطاع القيمة البديلة. أما COALESCE فتستخدم أولوية الأنواع المجمعة.
- قابلية النقل: تقتصر ISNULL على SQL Server، بينما تُعد COALESCE معيارًا من معايير ANSI.
التوصية التي يمكن ذكرها صراحةً: فضّلوا COALESCE لقابليتها للنقل وللحصول على أنواع متوقعة.
-- SQL Server: ISNULL may truncate the replacement to
-- the first argument's type (e.g. CHAR(1))
SELECT ISNULL(code, 'UNKNOWN') FROM items;
-- If code is CHAR(1), 'UNKNOWN' becomes 'U'
-- COALESCE picks the wider type and keeps 'UNKNOWN'
SELECT COALESCE(code, 'UNKNOWN') FROM items;IFNULL وNVL
تحتوي اللهجات الأخرى على اختصاراتها الخاصة ذات الوسيطين:
- MySQL / SQLite:
IFNULL(expr, replacement) - Oracle:
NVL(expr, replacement)، بالإضافة إلىNVL2لإضافة تفرّع then/else
تتصرف الدوال الثلاث مثل COALESCE ذات الوسيطين. وإذا سُئلتم تحديدًا عن الصيغة الاصطلاحية في MySQL أو Oracle، فاذكروا هذه الدوال؛ وإلا فاستخدموا COALESCE.
-- MySQL
SELECT IFNULL(bonus, 0) FROM employees;
-- Oracle
SELECT NVL(bonus, 0) FROM employees;
-- NVL2(bonus, 'has bonus', 'no bonus') -> if/else on NULLNULLIF: الاتجاه المعاكس
تُرجع NULLIF(a, b) قيمة NULL عندما تكون a = b، وإلا فإنها تُرجع a. فهي تعمل على نحو متعمد على إنشاء قيمة NULL، أي في الاتجاه المعاكس لـ COALESCE.
أشهر استخداماتها هو الحماية من القسمة على صفر. غلّفوا المقام داخل NULLIF(denominator, 0): فإذا كان المقام صفرًا، يصبح المقسوم عليه NULL، وتُرجع عملية القسمة بأكملها NULL بدلًا من إطلاق خطأ.
-- Avoid divide-by-zero: returns NULL instead of erroring
SELECT revenue / NULLIF(orders, 0) AS avg_order_value
FROM daily_stats;
-- NULLIF(5, 5) -> NULL
-- NULLIF(5, 3) -> 5الجمع بين NULLIF وCOALESCE
تتكامل الدالتان بشكل رائع. ومن الأمثلة النموذجية في المقابلات تعبير «قسمة آمنة تعرض 0 عند عدم وجود طلبات» في سطر واحد. استخدموا NULLIF لتجنب الخطأ، ثم COALESCE لاستبدال قيمة NULL الناتجة.
تُظهر هذه الصيغة المختصرة إتقانكم، إذ تعالجون الحالة الخاصة وطريقة العرض في تعبير واحد.
SELECT
COALESCE(revenue / NULLIF(orders, 0), 0) AS avg_order_value
FROM daily_stats;
-- orders = 0 -> NULLIF gives NULL -> division gives NULL
-- -> COALESCE turns it into 0معاملة السلاسل الفارغة كـ NULL
من الاستخدامات العملية الأخرى لـ NULLIF تحويل السلاسل الفارغة إلى NULL حتى يمكن دمجها بالطريقة نفسها. فكثيرًا ما تخلط البيانات غير النظيفة بين NULL و''؛ وهذا النمط يوحّد الحالتين.
اقرؤوا النمط هكذا: «إذا كانت القيمة فارغة، فحوّلوها إلى NULL، ثم استخدموا قيمة افتراضية». إنها إجابة واضحة وقابلة للنقل عن سؤال «كيف تعاملون القيم الفارغة والمفقودة بالطريقة نفسها؟»
-- Treat both '' and NULL as missing, default to 'Anonymous'
SELECT COALESCE(NULLIF(TRIM(username), ''), 'Anonymous')
FROM users;مثال أعمق: استخدام COALESCE عبر عمليات JOIN
بعد إجراء LEFT JOIN، تنتج قيم NULL في الجانب الأيمن للصفوف التي لم تجد تطابقًا. يحوّل COALESCE هذه القيم إلى قيم افتراضية مفيدة في الناتج، وهو مطلب شائع جدًا في التقارير.
هنا تظلّ العملاء الذين لا يملكون طلبات ظاهرين بفضل LEFT JOIN، ويظهر إجماليهم على أنه 0 بدلًا من NULL. إن ذكر أن COALESCE يُطبَّق بعد JOIN وليس داخله يوضح فهمكم لترتيب التقييم.
SELECT
c.name,
COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Customers with no orders get 0 instead of NULLنقاط مهمة للمقابلة
ملخص مجموعة أدوات الاستبدال:
- COALESCE(a, b, ...): أول قيمة ليست NULL، وتدعم عدة وسائط، وهي معيار ANSI، ويحدد نوعها ترتيب أولوية الأنواع. إنها الخيار الافتراضي.
- ISNULL / IFNULL / NVL: اختصارات ذات وسيطين خاصة بالمورّد؛ وقد تقتطع ISNULL القيمة وفق نوع الوسيطة الأولى.
- NULLIF(a, b): تُرجع NULL عندما تكون القيمتان متساويتين؛ وهي مناسبة جدًا للحماية من القسمة على صفر ولتوحيد السلاسل الفارغة.
- اجمعوا بين
COALESCE(x / NULLIF(y, 0), 0)للحصول على قسمة آمنة وقابلة للعرض.
ابدؤوا بذكر COALESCE، ولا تذكروا بدائل المورّد إلا عندما تكون اللهجة محددة.
اختبار سريع
اختاروا تعبير القسمة الآمنة.
مراجعة
يمكنكم الآن استبدال قيم NULL وإنشاؤها:
- COALESCE تُرجع أول قيمة ليست NULL من بين عدة وسائط؛ وهي الخيار الافتراضي القابل للنقل.
- تُعد ISNULL في SQL Server، وIFNULL في MySQL، وNVL في Oracle اختصارات ذات وسيطين؛ وقد تقتطع ISNULL القيمة وفق نوع الوسيطة الأولى.
- تُرجع NULLIF(a, b) قيمة NULL عندما تكون القيمتان متساويتين، وهي مثالية للحماية من القسمة على صفر ولتوحيد السلاسل الفارغة.
- اجمعوا بينها للحصول على تعبيرات آمنة وقابلة للعرض، ولتعيين قيم افتراضية لقيم NULL الناتجة بعد LEFT JOIN.
الدرس الأخير: كيفية تصرف NULL داخل دوال التجميع وعمليات JOIN وDISTINCT.
الأسئلة الشائعة
هل درس «COALESCE وNULLIF وISNULL» مجاني؟
نعم — نص درس «COALESCE وNULLIF وISNULL» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «COALESCE وNULLIF وISNULL»؟
استبدال القيم الافتراضية والفرق بين COALESCE والدوال الخاصة بكل مورّد تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟
لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «COALESCE وNULLIF وISNULL»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟
نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المنطق ثلاثي القيم وUNKNOWN
- IS NULL وIS NOT NULL والمساواة الآمنة مع NULL
- COALESCE وNULLIF وISNULL
- قيم NULL في التجميعات وعمليات الربط وDISTINCT