هر تلاشی برای تقسیم یک عدد بر صفر منجر به بروز خطای روبروی خواهد
شد: Divide by zero error encountered
چگونه می توانیم از این چنین اتفاق هایی جلویی گیری کنیم؟
در صورتی که شما به طور مکرر و ثابت مقدار یک ستون را بر یک ستون دیگر تقسیم می
کنید بهتر است یک قید چک روی ستون مقسوم علیه تعریف کنید. بطور مثال در جدول زیر
مقدار ستون X تقسیم به مقدار ستون Y
می شود:
CREATE TABLE [Sample]
(--X / Y
X INT NOT NULL,
Y INT NOT NULL,
CONSTRAINT PreventingDivideByZeroError
CHECK (Y <> 0));
ولی چگونه می توانیم در دستور SELECT مانع
بروز این خطا شویم؟ ما قصد داریم در صورت صفر بودن مقسوم علیه، مقدار
صفر و در غیر اینصورت مقدار X/Y به عنوان نتیجه انتخاب
شود.
استاندارد ترین راه حل این است که از عبارت CASE برای
بررسی مقدار مورد نظر استفاده کنیم، یعنی:
SELECT CASE WHEN Y = 0 THEN 0
ELSE X / Y
END AS [X/Y]
FROM table_name;
و با کمک گرفتن از توابع داخلی SQL Server
می توانیم یک ورژن فشرده تر ایجاد کنیم.
تابع NULLIF نیاز به دو پارامتر ورودی دارد اگر دو
پارامتر با یکدگیر برابر بودند مقدار NULL برگردانده
خواهد شد در غیر اینصورت مقدار پارامتر اول برمیگردد. از طرفی هر مقداری تقسیم بر
NULL شود نتیجه اش NULL خواهد
بود. و تابع COALESCE که حداقل نیاز به دو پارامتر دارد
اولین مقدار غیر NULL را بر میگرداند. با ترکیب این دو
تابع روش به شکل زیر در خواهد آمد:
البته شما به جای تابع COALESCE می توانید از تابع داخلی
SQL Server به نام ISNULL
استفاده کنید.
SELECT COALESCE(X / NULLIF(Y, 0), 0) AS Result
FROM table_name;