אם נקח לדוגמא כתובת IP שהיא בעצם מחרוזת של 4 מספרים ובניהם נקודה ונרצה לחלק אותה לארבע כדי לקבל את כל אחד מחלקי כתובת IP אז בעבר הייתי נדרש לכתוב סקריפט שימצא כל את מיקום הנקודה הראשונה במחרוזת – והערך הראשון – המספר הראשון של כתובת ה IP – היה משמאל לה לנקודה. אחר כך היינו צריכים למצוא את מיקום הנקודה הבאה בתור – והערך השני היה בין המיקום של הנקודה הראשונה והשניה וכך הלאה.
בעזרת פונקציה חדשה ופשוטה (PARSENAME) החיים הרבה יותר קלים:
לדוגמא:
Select PARSENAME('10.161.52.139',1) Select PARSENAME('10.161.52.139',2) Select PARSENAME('10.161.52.139',3) Select PARSENAME('10.161.52.139',4)
המספרים 1-4 מגדירים איזה חלק במחזורת (בכתובת ה IP) אני רוצה לקבל.
כל אחת משורות הקוד תתן לנו חלק אחד בלבד מתוך ארבעת המספרים.
"הבעיה" שהפונקציה החדשה יודעת לחלק מחזורות רק ע"פ מקומי הנקודה,
אבל מה קורה עם יש לנו מחרוזת שאנחנו רוצים לבודד את חלקיה וההבדל הוא לא נקודה אלא למשל רווח כמו במחרוזת הבאה 'Eran Shaked' ?
כדי ל"התגבר" על הבעיה הזאת נשתמש ב replace ונחליף את הרווח (או כל מפריד אחר) בנקודה.
Select PARSENAME(replace('Eran Shaked',' ','.'),1) Select PARSENAME(replace('Eran Shaked',' ','.'),2)
ערן שקד
Latest posts by ערן שקד (see all)
- TempDB – אופטימיזציה - 31/08/2012
- Indexes in SQL Server 2 - 13/06/2012
- PARSE בצורה מהירה ואלגנטית - 07/04/2012
תגובה אחת ל- “PARSE בצורה מהירה ואלגנטית”
עדיין פונקציית split של CLR תיתן דרך טובה יותר
1. כאן אנחנו צריכים לדעת מראש כמה איברים שלנו בהפרדה או שיהיה עלינו לעבוד עם לולאה
2. משאבים נמוכים יותר בשימוש ב SPLIT אם רוצים יותר מנתון מסויים
3. נוחות עבודה ללא צורך בהחלפה של תווים. בכל פונקציית SPLIT שמכניסים מגדירים פרמטר של ההפרדה (שיכול להיות לא רק תוו בודד כמובן)
השאר תגובה: