מדריך T-SQL: יציאה ודילוג בתוך לולאות


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

בפוסט הקודם למדנו מהן לולאות ואיך כותבים אותן. לעיתים נגדיר לולאה שתרוץ מספר מסוים של פעמים (נניח 100) אבל בפועל נרצה שתרוץ פחות פעמים במידה ותנאי מסוים מתקיים. בפוסט הזה נראה שתי דרכים לבצע זאת.


דילוג באמצעות CONTINUE

לפעמים נרצה לדלג על חזרות מסוימות של הלולאה תוך כדי ריצה. אנחנו יכולים להגדיר את תנאי הדילוג בעזרת הפקודה CONTINUE. במקרה כזה אנחנו מגדירים תנאי לוגי (למשל אם X = Y) וכאשר הוא מתקיים הלולאה "תמשיך" הלאה, כלומר תדלג על מה שמופיע אחרי משפט ה-CONTINUE ותחזור חזרה לראש הלולאה לביצוע ריצה נוספת. הקוד שיופיע לפני משפט ה-CONTINUE יבוצע כרגיל והדילוג יתרחש רק לגבי הקוד שמופיע אחר כך. כדי להדגים את הפעולה, נשתמש בתכנית מהפוסט הקודם. מטרת התכנית הייתה לחשב כמה דמויות בטבלת הדמויות נאמנות לכל בית או קבוצה ולהדפיס הודעה מתאימה עבור כל בית. התכנית נראית כך:


והתוצאה נראית כך:


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


אבל יש בעיה אחת – אם נציב את תנאי הדילוג לפני ההדפסה זה אומר שנדלג גם על ההקפצה של המשתנה counter מה שאומר ש-SQL Server ימשיך לבדוק כל הזמן את אותו מספר בית, ימשיך לקבל 0 במספר התומכים וימשיך לקפוץ לראש הלולאה – וכך נתקע בלולאה אין סופית. לכן כשמשתמשים בתנאי דילוג חשוב לוודא שמקדם הלולאה נכתב מעל כדי שהלולאה אכן תמשיך להתקדם. נפתור את הבעיה על ידי הצבה של קידום המשתנה בתחילת הלולאה וכדי לתמוך בשינוי הזה נשנה את הערך ההתחלתי שלו ל-0:

עכשיו התוצאה הסופית נראית ככה:

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


יציאה מלולאה באמצעות BREAK

לפעמים נרצה להגדיר שאם תנאי מסוים מתקיים אנחנו לא מסתפקים רק בדילוג על הריצה הנוכחית, ורוצים להפסיק את פעולתה של הלולאה לגמרי ללא קשר למספר הפעמים שעוד נשאר לה לרוץ (בהתאם לתנאי הכניסה). לשם כך נשתמש בפקודת BREAK שתופיע, בדומה ל-CONTINUE לאחר תנאי לוגי בגוף הלולאה. במקרה הזה נניח שהחלטנו שלא אכפת לנו כמה בתים יש בטבלה, אבל נרצה לוודא שהבית האחרון שאנו בודקים יהיה Targaryen (אחריו אין לנו צורך להמשיך לבדוק את שאר הבתים). כאן אנחנו כבר זקוקים לשתי הבדיקות כי אנחנו מעוניינים לצאת מהלולאה אחרי ביצוע הבדיקה עבור הבית:


עכשיו התוצאה תראה ככה:


גם במקרה של CONTINUE וגם במקרה של BREAK התנאים אינם מחייבים. בדוגמה האחרונה, טבלת קבוצות שלא הייתה מכילה את בית Targaryen הייתה מקבלת סריקה מלאה והלולאה הייתה מסיימת את מספר הריצות שהוגדר לה. בדוגמה של CONTINUE היינו עשויים להראות את כל הבתים, אם כולם היו גדולים מספיק, או לא להראות אף שורה אם כל הבתים היו בעלי 3 עוקבים ומטה – הלולאה פשוט הייתה מדלגת על כל השורות בטבלה.

© כל הזכויות שמורות לאלעד פלג הדרכות 2020