הבלוג של גרי רשף

26/04/2010

תנאי Where המאפשר להציג את כל הרשומות

Filed under: Uncategorized — תגיות: — גרי רשף @ 07:50

הבעייה הזו אופיינית לדוחות: בנינו דוח המציג שליפה מסויימת, והוא כולל אפשרות לבחור פרמטר מסויים.
למשל- המשתמש יכול לבחור ID כלשהו, והדוח יציג את הרשומה או הרשומות עם אותו ID;
אבל אנחנו רוצים, בנוסף, לאפשר למשתמש להציג את כל הרשומות.
פתרונות מסורבלים לא חסרים: ליצור שני דוחות שונים, או להריץ קוד שיבנה באופן דנאמי את ה-SQL – במקרה אחד עם פילטר ובאחר – בלעדיו;
אבל יש גם פתרונות אלגנטיים במחיר שווה לכל נפש, שלאחר שרואים אותם אומרים במבט מופתע: "וואלה? איך לא חשבתי על זה..

הפתרון הפשוט ביותר הוא להשתמש ב-IsNull כך שאם לא נספק ערך לפילטר – ה-ID יהיה שווה לעצמו:

Declare    @ID1 Int;

Set        @ID1=3;

Select    *

From    sys.objects

Where    object_id=IsNull(@ID1,object_id);

 

Declare    @ID2 Int;

Select    *

From    sys.objects

Where    object_id=IsNull(@ID2,object_id);

במקרה הראשון הפרמטר ID1@ מקבל את הערך 3 והשליפה מחזירה רק את הרשומה המתאימה,

ובמקרה השני הפרמטר ID2@ אינו מקבל ערך ונשאר Null, וכל הרשומות חוזרות (התנאי Where object_id=object_id הוא חסר משמעות).

מכיוון שלהסתמך על ערכי Null של פרמטרים זו משענת קנה רצוץ, פתרון יותר בטוח הוא לקבוע ערך ברירת מחדל או ערך מחוץ לתחום שמשמעותו תהיה "כל הרשומות" (נניח אם בונים Combo Box עם כל ה-ID ורוצים לכלול גם את האפשרות של "כל הרשומות"), ואז נשתמש בתנאי Case כך (הפעם נבנה פרוצדורה מתאימה):

Create Proc P_Objects(@ID Int=-1) As

Select    *

From    sys.objects

Where    object_id=Case When @ID=-1 Then object_id Else @ID End;

ונפעיל אותה פעם עם ערך ופעם ללא ערך כדי לוודא שהיא תקינה:

Exec P_Objects 3;

Exec P_Objects;

מודעות פרסומת

2 תגובות »

  1. ומה לא טוב בזה?
    WHERE (object_id = @ID1 OR @ID1 IS NULL)

    תגובה של חיים — 26/04/2010 @ 09:04

    • איש אינו אומר שזה לא טוב, להיפך- זה טוב מאוד..
      זה בערך כמו ה-IsNull שהצעתי,
      ובהחלט אפשר לחשוב על ניסוחים אחרים של אותו רעיון!

      תגובה של גרי רשף — 26/04/2010 @ 09:12


RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

יצירה של אתר חינמי או בלוג ב־WordPress.com.

%d בלוגרים אהבו את זה: