Sql שימוש בערך Null ע"י אופרטור השוואה
-
שלום, יש למישהו הסבר למה כשאני מתייחס לערכי null אני חייב להשתמש ב Is.
אני למשל רוצה sql שיעבוד ככה:declare @null int = null; select * from Documents d where d.ContactID = @null
הוא לא מחזיר לי רשומות על אף שכאשר אני עושה Is Null הוא מחזיר גם מחזיר.
אז למה זה כל כך חשוב לי, כי אני כותב פונקציה שבה ערכים מסויימים עשויים להכיל ערך נול, והטיפול הופך להיות מייגע עם תנאים ושאילתות רבות שחוזרות על עצמן רק בגלל ערכי null שיש בכמה מקומות.
מי שיאמר שעבורו אין דבר כזה ערך null יצטרך לנמק. אני חושב שמסד נתונים צריך להיות בצורה שאם אין ערך צריך להיות null כלומר לא ערך כמו 0 או "" וכדומה. זה נקרא שקר! אלא מה? יגידו שבעצם במעבד יש זיהוי ל null, אז כאן כבר נכנסים לשאלה מה נקרא "אמת" במסד נתונים, הערכים הריאליים, כלומר ערכי ה"אדם" (ואז null הוא בעצם ייצוג של ריקנות, הואיל וכלפי הנתונים כפי שהם אמורים להיות מוצגים לאדם כך הם פני הדברים באמת) או הערכים המחשביים הם הקובעים, דהיינו מה שרוחש שם במעבד מתחת לאדמה ואז יבוא הטוען ויטען שערך null זה בעצם הצגה כי יש רק 0 ו 1.
פורסם במקור בפורום CODE613 ב11/03/2014 20:15 (+02:00)
-
למעשה השיטה היחידה שאני רואה כרגע שאפשר לעבוד איתה כדי להתמודד עם זה ולהימנע מכפל כפליים של שאילתות היא זו:
declare @null int = null; select * from Documents d where (d.ContactID is null and @null is null) or (d.ContactID = @null and @null is not null)
פורסם במקור בפורום CODE613 ב11/03/2014 20:20 (+02:00)
-
ארכיטקט, null זה אכן חור שחור, אני לא ממש יודע למה, אבל הוא מהווה עיקרון חשוב במסד נתונים ("מידע חסר" - ראה http://en.wikipedia.org/wiki/Null_(SQL).
אבל אתה כמעצב המסד יכול למנוע null וגם לתת ערך ברירת מחדל.בקשר למקרה הספציפי, אתה מידי מצמצם. איך זה שאתה מחפש לפי משתנה ולפעמים אתה שם בו Null?
וגם בקוד שלך הארכת ונהגת כבתנאי בני גד וראובן, היה לך די לכתוב ככה:select * from Documents d where (d.ContactID is null and @null is null) or d.ContactID = @null
פורסם במקור בפורום CODE613 ב12/03/2014 11:50 (+02:00)
-
למה לא להשתמש בפונקצייה ISNULL (מקביל לNZ באקסס) ואז, אם הערך הוא NULL - אתה מעביר ומחפש 0, ואם הערך 37 אתה מחזיר לפי 37.
declare @null int = ISNULL(null,0); select * from Documents d where ISNULL(d.ContactID,0) = @null
ובעצם גם בפנייה שלך לפונקצייה אתה "מעביר" את הערך דרך ISNULL:
fn(ISNULL(d.ContactID,0))
עריכה:
אם זה מפתח זר,ואתה רוצה לברוח מאפשרות של 0 (במידה ולפעמים אתה שם 0 כשאין כלום, ואתה רוצה לדעת אם זה NULL או 0 במסד פיזית), אתה יכול להעביר לISNULL ערך אחר במקום 0.ISNULL(d.ContactID,-1))
פורסם במקור בפורום CODE613 ב12/03/2014 12:14 (+02:00)