דוגמא א: המרה מתאריך לטקסט.
אם נמיר תאריך לטקסט באמצעות אחת מהפונקציות הבנויות בDB, לדגומא to_char בOracle או convert ב Sql Server, נקבל תוצאה אשר נראית יפה על המסך, אך פגומה לכל דבר אחר.
נראה את הדוגמא בOracle, אך היא תהיה זהה גם בבסיסי נתונים אחרים.
נניח שישנה טבלה ובה יש שדה מסוג date המתאר תאריך מכירה. בוא נניח ששם השדה: sales_date.
בשדה זה ישנם שתי רשומות: 1/1/2006 ו 2/5/2004.
במצב הזה כשהשדה מוגדר כdate, שאילתא פשוטה כמו:
Select *
From
Table
Where sales_date>to_date('2/5/2004','dd/mm/yyyy')
הערה: השתמשנו בדוגמא ב to_date כדי להמיר את המחרוזת '2/5/2004' לייצוג תאריכי.
לא תהווה בעיה בכל מה שקשור לתוצאות של השאילתא, משום שהמחשב יכול לקבוע הבדל בגדלים כאשר מדובר בשדה תאריכי. בכל מקרה, אנו נקבל רשומה אחת בלבד עם תאריך 1/1/2006.
בוא נעשה שינוי קל אך מהותי בשאילתא. נעביר את היצוג של התאריכים משדה תאריכי לשדה טקסטואלי. כלומר, נכתוב:
Select *
From
Table
Where to_char(sales_date)> '2/5/2004'
הערה: פונקציית ORACLE, to_char מעבירה ערכים לא קרקטריאלים (כגון, תאריכים) לפורמט קרקטריאלי.
לכאורה התצוגה על המסך של to_char(sales_date) זהה לחלוטין לזאת של sales_date, אלא הבדל רב בניהם.
במקרה של sales_date, הערך בשדה נשמר כתאריך (הגדרת השדה בDB) וכפי שציינו, תאריך הוא למעשה מספר ולכן המחשב יוכל לקבוע את היחס בין ערכים שונים.
המקרה של to_char(sales_date) יותר מורכב. מכייוון שהעברנו את התאריך לטקסט, אוסף הבתים המאחסנים את הנתון בזכרון הם פשוט כפי שנראים על המסך.
לדוגמא :הראשון בינואר 2006 יאוחסן בבסיס הנתונים כ:
אולי מבחינה ויזואלית זה נראה תקין, אך אם ניקח תאריך נוסף ,שני לינואר 2000באותו שדה ועם to_char. נקבל איחסון, כזה:
כעת, אם ניקח את ההסבר לגבי מיון מחרוזות טקסט, כפי שהוסבר מקודם ונתחיל להשוות משמאל לימין, נראה ש 2\1\2000 גדול מ1\1\2006...
דוגמא ב: המרת שדות מספרים לטקסט.
נניח שישנו שדה sales_amount המוגדר כשדה מספרי בעל 3 פוזיציות, כלומר יכול להכיל ערכים בין 0 ל999.
לדוגמא,
Select sales_amount
From
Table
Where sales_date>122
השאילתא הזאת , תחזיר תוצאה תקינה לחלוטין.
מה יקרה אם נהפוך את השדות לקרקטריאלים?
כלומר:
Select sales_amount
From
Table
Where to_char(sales_date)>'122'
בואו ננתח:
לצורך העניין נבדוק האם הערך 235 המאוחסן בתוך השדה, יוצג.
נבדוק את הייצוג:
מצד אחד:
מצד שני:
אם ניקח את ההסבר למיון מחרוזות נראה ש 2 גדול מ1 , לכן 235 גדול מ122.
אך לפנינו מוקש גדול:
מה יקרה אם נשווה את 2 ל122, נקבל:
וכן
אם נפעיל את מיון המחרוזת , נקבל ש2 גדול מ122...
לכן, במקרה של מעבר ערכים מספרים לקרקטריאלים, נהוג "לרפד" את המחרוזת עם אפסים מצד שמאל, ואז בדוגמא להלן, 2 יוצג כ:
ריפוד זה ניתן לבצע באמצעות פונקציות מובנות כגון lpad באורקל. בכל מקרה זה יפתור את ה"מוקש" שהצגנו והבעיה תפתר.
נוכל לסכם , שיש להבין את נושא האורדינליות הן בשימוש בכלים אוטומטים והן בכתיבת SQL.