شرح صفوف ومحتوى الفقرة
يُعد وجود القيمة NULL داخل قائمة NOT IN (...) من أشهر الفخاخ المنطقية في لغة SQL على الإطلاق.
- لماذا ينجو المعامل IN من NULL: يتحول التعبير
x IN (10, 20, NULL)إلىx = 10 OR x = 20 OR x = NULL؛ فإذا كانت قيمةxهي10فإن النتيجة1 OR 0 OR NULLتساوي1وتظهر الصفوف المطابقة طبيعياً. - لماذا يُعيد NOT IN صفراً من الصفوف: يتحول التعبير
x NOT IN (10, 20, NULL)إلىx <> 10 AND x <> 20 AND x <> NULL؛ وبما أنx <> NULLيُعيد دائماًNULL، تصبح المعادلة1 AND 1 AND NULLوتساويNULLلكل صف في الجدول فيُستبعد الجميع!
لذلك احرص دائماً على خلو قوائم NOT IN تماماً من أي قيمة فارغة NULL.
SQL
-- Compare IN vs NOT IN when NULL is present in the list
SELECT (10 IN (10, 20, NULL)) AS in_with_null,
(30 NOT IN (10, 20, NULL)) AS not_in_with_null,
(30 NOT IN (10, 20)) AS safe_not_in;