לך, יא אפס

כשהייתי ילד, למדתי שכל מספר המחולק בעצמו, שווה ל-1.

כל מספר, חוץ מאפס.

אפס חלקי אפס לא שווה 1, אלא שגיאה.

למעשה, כל מספר חלקי 0 שווה שגיאה.

במילים אחרות, אי אפשר לחלק ב-0.

עד פה לא חידשתי לכם כלום.

אוקיי, אם להשאר רגע בילדות, אם שואלים שאלה כזאת: "אם יש לדני 5 תפוחים, והוא צריך לחלק אותם ל-0 ילדים, כמה יקבל כל ילד?" התשובה – בלי לחשוב בכלל – היא: "אי אפשר לחלק לאפס!"

אבל אם השאלה תהיה מנוסחת טיפה שונה, משהו כמו: "יש בחדר 3 ילדים, ובדיוק כשדני נכנס עם 5 תפוחים, 2 ילדים יוצאים מהחדר, ואחרי רגע עוד 1 יוצא, ודני צריך לחלק לילדים שנותרו את התפוחים. כמה יקבל כל ילד?"

אה… עכשיו זה כבר נהיה מסובך. עכשיו זה כבר לא טרוויאלי לענות שאי אפשר לחלק באפס, כי צריך לגלות קודם כל אם המכנה הוא אפס או לא, ורק אז – אם הוא אפס לא לחלק, ואם הוא לא אפס כן לחלק.

כשאנחנו כותבים תכניות, או שאילתות SQL, לעיתים נדירות אנחנו מחלקים במספרים. באופן נורמלי אנחנו מחלקים במשתנה, ואנחנו צריכים לדאוג למקרה שערך המשתנה הוא אפס.

הדרך הארוכה לעשות את זה (ב-SQL)היא:

Select case when yy<>0 then  xx/yy else null end as result

ואם יש לכם שאילתא עם כמה חלוקות – הקוד הופך להיות מסורבל ובלתי קריא.

וכאן בא לעזרתנו הפונקציה NULLIF שמקבלת שני פרמטרים ומחזירה NULL אם הם שווים,  או את הפרמטר הראשון אם הם שונים, ובמקום הדוגמא המסורבלת מקודם, כותבים פשוט:

Select xx/nullif(yy,0) as result

אם yy=0 – הפונקציה תחזיר NULL והתוצאה תהיה xx/NULL=NULL,

אם yy<>0 – הפונקציה תחזיר yy והתוצאה תהיה xx/yy.