IS [NOT] DISTINCT FROM و NULL
در این مقاله دستور IS [NOT] DISTINCT FROM را برای جلوگیری از برخی مشکلات NULL معرفی میکینم.
در مقاله NULL و دردسرهای آن بطور اجمالی به محتوا و کاربرد NULL در DB2 پرداختیم.
اما در این مقاله به کاربرد عملگری (IS [NOT] DISTINCT FROM) میپردازیم که کمتر مورد توجه قرار گرفته است ولی میتواند بسیاری از برنامه های ما را ساده سازی کند.
IS [NOT] DISTINCT FROM چیست؟
IS [NOT] DISTINCT FROM یک عملگر گزاره ای (Predicate Operator) در SQL است که در نسخه ۸ به DB2 اضافه گردید. اما مورد استقبال زیادی قرار نگرفت.
افراد بسیاری از وجود عملگر IS [NOT] DISTINCT FROM بی اطلاع هستند.
استفاده از این عملگر در زمانی که میخواهید دو ستون که دارای NULL هستند را مقایسه کنید، بسیار کاربردی و راحت می باشد.
برای مطالعه کامل مبحث NULL و دردسر های آن اینجا کلیک نمایید.
چرا IS [NOT] DISTINCT FROM ؟؟
قبل از وارد شدن به بحث این عملگر، ابتدا درباره ی مشکلی که با کمک آن بر طرف می شود صحبت کنیم.
می دانیم که دو ستون که دارای NULL می باشند، به هیچ وجه نمی توانند یکسان باشند، زیرا که NULL ها ناشناخته هستند و هیچ وقت نمی توانند برابر با هیچ چیز دیگری باشند، حتی یک NULL دیگر.
اما گاهی ممکن است که بخواهید NULL ها را یکسان در نظر بگیرید.
برای انجام این کار، باید یک کد در عبارت Where خود وارد کنید. مانند مثال زیر:
WHERE COL1 = COL2
OR (COL1 IS NULL AND COL2 IS NULL)
راه حل ( استفاده از IS [NOT] DISTINCT FROM )
این کدنویسی باعث می شود تا DB2 تمام ردیف هایی که در آن، ستون ۱ و ستون ۲ دارای مقادیر یکسانی هستند را بازگرداند.
همینطور در ردیف هایی که هر دو ستون ۱ و ۲ آنها NULL باشند، NULLها را یکسان محسوب می کند.
این کد هرچند ممکن است ساده به نظر برسد، اما می تواند سنگین و ناکارآمد باشد.
اینجاست که عبارت IS [NOT] DISTINCT FROM نجات دهنده می شود.
از نسخه DB2.v8 به بعد، عبارت زیر به طور منطقی برابر با دستورات بالا می باشد، اما ساده تر و قابل فهم تر:
WHERE COL1 IS NOT DISTINCT FROM COL2
کاربرد دیگر IS [NOT] DISTINCT FROM
همین اتفاق برای چک کردن یک ستون برای یک متغیر می افتد.
شما ممکن است بخواهید کدی بدهید که در آن مشخص کنید Where Col = :hv / :hvind.
زمانی که مقدار در متغیر NULL باشد، چنین شرطی هیچ وقت نمی تواند درست باشد.
حتی اگر متغیر میزبان دارای یک نشانگر NULL باشد. به این دلیل که یک NULL هیچ وقت مساوی با یک NULL دیگر نیست، هیچ وقت!
به جای آن، باید عملگرهای اضافه ای به دستور اضافه کنیم.
( در این حالت میتوان از IS [NOT] DISTINCT FROM استفاده کرد.)
یک عملگر برای مدیریت کردن مقادیر غیر NULL، و دو عملگر دیگر برای اطمینان از اینکه هم Col1 و هم :hv هر دو NULL هستند.
با معرفی عملگر IS [NOT] DISTINCT FROM ، شرط جستجوگر می تواند به شکل زیر ساده شود:
WHERE COL1 IS NOT DISTINCT FROM :HV :hvind
برای مطالعه این مقاله به زبان انگلیسی اینجا کلیک کنید.