Menu

SQL CASE ב-SQLite: WHEN, THEN, ELSE ו-IIF

איך CASE עובד ב-SQLite: הצורה הפשוטה והצורה המחפשת, שימוש בו ב-SELECT, ב-ORDER BY וב-WHERE, ומתי עדיף להשתמש ב-IIF.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

CASE הוא ה-If/Else של SQL

CASE הוא הדרך להכניס לוגיקה מותנית לתוך שאילתה. הוא עובר על ענפי WHEN לפי הסדר, בוחר את הראשון שמתאים, ומחזיר את הערך שאחרי THEN. אם שום דבר לא מתאים, הוא מחזיר את הערך של ELSE, או NULL אם לא כתבתם כזה.

המילה החשובה היא ביטוי. CASE מפיק ערך, ולכן הוא יכול להופיע בכל מקום שבו מותר ערך: עמודה ב-SELECT, מפתח ב-ORDER BY, הצד השני של השוואה, ארגומנט לפונקציה.

זה כל המבנה: CASE, אחד או יותר WHEN ... THEN ..., ELSE אופציונלי, ואז END. ה-END הוא חובה: לשכוח אותו זו טעות ההקלדה הנפוצה ביותר.

דוגמה מציאותית

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

הענפים נבדקים מלמעלה למטה. ההתאמה הראשונה מנצחת, אז סדרו אותם מהספציפי ביותר לכללי ביותר. ה-ELSE תופס את כל מה שלא התאים: בלעדיו, 1200.00 היה חוזר כ-NULL במקום 'large'.

מחפש מול פשוט

מה שראיתם למעלה הוא הצורה המחפשת: לכל WHEN יש תנאי בוליאני משלו. יש צורה קצרה יותר כשמשווים ביטוי אחד לכמה קבועים, הצורה הפשוטה:

הביטוי שאחרי CASE מחושב פעם אחת ומושווה עם = לכל ערך של WHEN. נקי יותר כשעושים בדיקות שוויון על עמודה אחת.

מלכודת אחת: CASE פשוט משתמש ב-=, ו-NULL = NULL הוא לא אמת ב-SQL. אם status יכול להיות NULL, הענפים 'A'/'B'/'C' לא יתאימו לו, ותגיעו ל-ELSE. כדי לטפל ב-NULL במפורש, עברו לצורה המחפשת והשתמשו ב-WHEN status IS NULL THEN ....

CASE ב-ORDER BY

ORDER BY מקבל כל ביטוי, ולכן CASE עובד שם מצוין. שימושי כשאתם רוצים סדר מיון מותאם שלא תואם סדר אלפביתי או מספרי:

לפי סדר אלפביתי 'high' < 'low' < 'medium', וזה חסר תועלת למיון פניות לפי דחיפות. מיפוי של כל עדיפות למספר דרך CASE נותן לכם את הסדר שאתם באמת רוצים. ה-, id שבסוף מכריע בשוויון באופן יציב.

CASE ב-WHERE

אפשר לשים CASE בתוך WHERE, אבל ברוב המקרים אין בזה צורך: שרשור של AND/OR ברור יותר. הוא זוהר כש_התנאי עצמו_ תלוי בערך אחר:

פריטים במבצע עוברים מתחת ל-20, פריטים רגילים מתחת ל-30. הסף עצמו מותנה. בלי CASE הייתם צריכים לכתוב (on_sale = 1 AND price < 20) OR (on_sale = 0 AND price < 30): אותה תוצאה, יותר רעש.

CASE בתוך פונקציות צבירה

כאן CASE מצדיק את קיומו. שלבו אותו עם SUM או COUNT כדי לחשב סכומים על תת קבוצה של שורות במעבר אחד: המקבילה ב-SQL ל"ספרו כמה מאלה מתאימים":

ה-CASE מחזיר 1 לשורות שמתאימות ו-0 לכל השאר, כך ש-SUM הופך לספירה מותנית. אותו טריק עובד להכנסות: מחזירים total בשורות המתאימות ו-0 בכל מקום אחר. סריקה אחת של הטבלה, כמה צבירות מותנות.

IIF: קיצור הדרך לשני ענפים

לתנאי אחד עם שתי תוצאות, ל-SQLite יש IIF(cond, when_true, when_false). זה פשוט קיצור של CASE WHEN cond THEN when_true ELSE when_false END:

השתמשו ב-IIF כשהלוגיקה בינארית ונקראת טוב יותר בשורה אחת. עברו ל-CASE כשיש שלושה ענפים או יותר, כשצריך לטפל ב-NULL בנפרד, או כשאתם רוצים את סדר הבדיקה של כמה פסוקיות WHEN.

מלכודות שכדאי להכיר

כמה דברים שתופסים אנשים:

  • לשכוח את END. CASE פותח בלוק; END סוגר אותו. SQLite תיתן לכם שגיאת פענוח הרבה אחרי המקום של הטעות עצמה.
  • בלי ELSE מקבלים NULL. אם אף ענף WHEN לא מתאים ודילגתם על ELSE, התוצאה היא NULL. לפעמים זה מה שאתם רוצים; בדרך כלל לא.
  • סדר הענפים חשוב. בצורה המחפשת, ה-WHEN ה_ראשון_ שמתאים מנצח. אם תשימו WHEN total < 500 לפני WHEN total < 100, לענף השני לעולם לא תגיעו.
  • ערבוב טיפוסים. כל ענף יכול להחזיר טיפוס אחר, ו-SQLite לא תתלונן, אבל קוד שמשתמש בתוצאה עלול כן. נסו לשמור שכל הענפים יחזירו טיפוסים תואמים (כולם טקסט, כולם מספרים).
  • CASE פשוט ו-NULL. כמו שהוזכר: הצורה הפשוטה משתמשת ב-=, שאף פעם לא מתאים ל-NULL. השתמשו בצורה המחפשת כשיש NULL בתמונה.

הבא בתור: פונקציות מחרוזת

CASE מאפשר להתפצל לפי ערכים; הפרק הבא מתחיל ב_שינוי_ ערכים. פונקציות מחרוזת, UPPER, LOWER, SUBSTR, REPLACE ותבניות LIKE, מטפלות בעבודה היומיומית של ניקוי ועיצוב מחדש של עמודות טקסט. זה מה שמחכה בהמשך.

שאלות נפוצות

מהו ביטוי CASE ב-SQLite?

ביטוי CASE הוא הגרסה של SQL ל-if/else: הוא בודק תנאים ומחזיר ערך. זה ביטוי, לא פקודה, ולכן אפשר להשתמש בו בכל מקום שבו מותר ערך: ב-SELECT, ב-WHERE, ב-ORDER BY, ב-UPDATE, ואפילו בתוך פונקציות צבירה. לכל ענף יש הצורה WHEN condition THEN value, עם ELSE אופציונלי בסוף.

מה ההבדל בין CASE פשוט ל-CASE מחפש ב-SQLite?

CASE פשוט משווה ביטוי אחד לכמה ערכים: CASE status WHEN 'A' THEN ... WHEN 'B' THEN ... END. CASE מחפש בודק תנאי בוליאני נפרד בכל ענף: CASE WHEN price > 100 THEN ... WHEN qty = 0 THEN ... END. הצורה המחפשת גמישה יותר: היא יכולה לשלב בחופשיות עמודות, אופרטורים ובדיקות NULL.

מתי כדאי להשתמש ב-IIF במקום CASE ב-SQLite?

IIF(cond, a, b) הוא קיצור של CASE WHEN cond THEN a ELSE b END. השתמשו ב-IIF ללוגיקה של שני ענפים כשהוא קריא יותר. עברו ל-CASE כשיש שלושה ענפים או יותר, כשאתם רוצים סדר בדיקה של ענף אחר ענף, או כשצריך לטפל ב-NULL במפורש עם WHEN col IS NULL.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל