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

09/04/2010

כמה פעמים מופיעה מחרוזת אחת בתוך אחרת?

Filed under: Uncategorized — תגיות: , , , — גרי רשף @ 20:37

טריק עתיק יומין ופשוט ששלפתי מהבוידעם לאחר שנתקלתי בדוגמה הזו שמצליחה לסבך את הבעייה ללא צורך.

הטריק הוא למצוא את ההפרש בין אורך המחרוזת המקורית,
לבין אורך המחרוזת לאחר שהסרנו ממנה את תת המחרוזת.

למשל- כמה פעמים מופיעה האות e בשם Geri Reshef?
אורך השם Geri Reshef הוא 11 תווים,
אם נוריד את e נקבל Gri Rshf שאורכו 8 תווים,
ומכאן ש-e מופיע 3=11-8 פעמים.

לו הייתי מחפש תת מחרוזת שאורכה גדול מ-1, היה עלי לחלק את התוצאה באורך תת המחרוזת.

דוגמה לחיפוש מחרוזת באורך תו אחד:

Declare    @S1 Varchar(Max),

        @S2 Varchar(Max);

Select    @S1='Geri Reshef',

        @S2='e';

Select DataLength(@S1)-DataLength(Replace(@S1,@S2,'')) Occurences;

דוגמה לחיפוש מחרוזת בכל אורך שהוא:

Declare    @S1 Varchar(Max),

        @S2 Varchar(Max);

Select    @S1='Count appearance of a particular string within the outer string',

        @S2='String';

Select (DataLength(@S1)-DataLength(Replace(@S1,@S2,'')))/DataLength(@S2) Occurences;

כמובן שב"מקרה אמיתי" (נניח- שליפה מטבלה) – תופיע רק שורת ה-Select האחרונה עם שמות השדות הרלוונטיים במקום המשתנים שאני הגדרתי.

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

5 תגובות »

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

    כעיקרון, אני נוהג להשמתמש בדרך, שאתה מראה, כאן, אבל היתה לי עם הדרך הזאת נפילה אחת בגלל מקרה קצה. כאשר יש מקרה, שבו אני מחפש מחרוזת, ויש לה מופע שסוגר את המחרוזת (כמו בדוגמא שלך כאשר אתה מחפש את המחרוזת string, בתוך מחרוזת שנסגרת עם הביטוי string), אבל כמות הרווחים בין החלק האחרון למילה שלפניה גבוה מאורך המחרוזת שמחפשים, מקבלים תוצאה שגוייה. מאחר, שבתגובות קשה להוסיף קטעי קוד באנגלית, אז אני רק אכתוב את המחרוזת, שתתן לנו תוצאה שגויה:
    Select @S1='Count appearance of a particular string within the outer string'

    אני מודה, שמדובר במקרה קצה די נדיר כאשר מחפשים מחרוזת בגודל מספר בתים.

    עדי

    תגובה של עדי — 08/06/2010 @ 08:49

    • מסתבר, שגם קשה לכתוב רק את המחרוזת באנגלית:-). בעיקרון צריך להוסיף מספר רווחים בין המילים outer וstring כדי לראות את המקרה, שנופלים בו.

      עדי

      תגובה של עדי — 08/06/2010 @ 08:52

      • ניסיתי וזה עדיין עובד בסדר: הוספתי רווחים לפני ה-String האחרון, הוספתי רווחים אחריו, הוספתי תווי Tab ותווי מעבר שורה, ולא גיליתי שום בעייה.
        יכול להיות שאתה מחפש את המילה השלמה String (כלומר- שיספור את String אך לא את Strings) ואז יש לחפש String עם רווח מימין ורווח משמאל?

        תגובה של גרי רשף — 08/06/2010 @ 09:43

        • הי גרי

          לצערי אי אפשר לשלוח בתגובות את הקוד או הסטרינג בצורה נורמאלית. אני אשלך לך במייל את הקוד שלך עם שינוי אחד בלבד – אני אשנה את כמות הרווחים בסטרינג שנקרא @S1.

          עדי

          תגובה של עדי — 08/06/2010 @ 10:29

          • צודק- הפונקציה Len מתעלמת מהרווחים בסוף (כלומר- עושה Trim בלי להודיע),
            ובמקרה זה יש להשתמש ב-DataLength.
            אתקן את הפוסט למען הדורות הבאים.

            תגובה של גרי רשף — 08/06/2010 @ 13:15


RSS feed for comments on this post. TrackBack URI

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s

בלוג בוורדפרס.קום.

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