סדר החישוב של תנאים
-
זכורני מ-C# שאם רציתי להתנות במשתנה שעלול להיות לא מוגדר/מאותחל, במקום לבדוק:
If (X !=null)
ואז לעשות את התנאי שלי, הייתי בודק:
If (X !=null && <התנאי שלי>)
כי אם הייתי בודק מיד את התנאי שלי, היתה שגיאה שהמשתנה לא מוגדר.
היוצא מהנ"ל שברגע שהתנאי הראשון לא מתקיים,לא עוברים לתנאי השני (במקרה של &&), אפילו שזה באותה "שורה".
שאלתי:
האם גם בשאילתת מסד נתונים (SQL ו-NoSQL) זה עובד כך? כי אני רוצה לעשות תנאי מתמטי מסובך, אבל יש לי גם תנאי פשוט יותר שגם צריך להתקיים.
השאלה היא האם יש חשיבות לסדר.פורסם במקור בפורום CODE613 ב08/06/2016 22:04 (+03:00)
-
לתכונה שאתה מתאר קוראים short-circuiting (וזה קורה ב&& וב|| הכפולים בC# לאפוקי הבודדים).
את השאלה המעניינת שלך שואלים פה http://stackoverflow.com/q/11219791/1271037, והתשובה היא א. אם מה שמטריד אותך זה ביצועים - בכל מקרה אתה מוגן כי כי תוצאה מוקדמת מפסיקה את חישוב התנאי הנוסף (גם בסדר הפוך, מה שאין בC#).
ב. שאין כל שליטה על מי יבוצע ראשון והאם יבוצע - האופימייזר מחליט מה לבצע קודם (ובזה יש מעלה על C# שכן שם זה לפי הסדר לטוב ולמוטב).
פה יש המחשה ע"י שגיאת חלוקה באפס: https://blogs.msdn.microsoft.com/bartd/2011/03/03/dont-depend-on-expression-short-circuiting-in-t-sql-not-even-with-case/, ואף הוא מביא פתרון איך לסדר את זה מה שבעצם כופה על הSQL סדר.פורסם במקור בפורום CODE613 ב08/06/2016 23:37 (+03:00)