חיפוש ביטוי בטקסט ע"י SQL

אורית391

New member
חיפוש ביטוי בטקסט ע"י SQL

היי
יש לי קבצי טקסט שאני צריכה לחפש בתוכם מילה או ביטוי
הרעיון צריך להיות להפריד כל מילה לרשומה בטבלת מילים
למשל המשפט i love you
ישמר כ-
1 i
2 love
3 you
השאלה היא מה הדרך היעילה ביותר לחפש ביטוי בטבלה כזו?
אם למישהו יש רעיונות אחרים אשמח לשמוע
5848
 
מנצלש: Left goin, GroupBY ועוד...

יש לי את השאילתא הבאה (מצטער, ניסיתי להכניס כsnippet, לא עבד):
&nbsp
SELECT EventTypes.TypeID,eventType,data,logo,Max(priority) priority,eventID, closeDate
FROM Events,EventTypes Left Join EventGraphics on EventTypes.TypeID= EventGraphics.TypeID Where Events.eventType=EventTypes.TypeID And eventStatus=0 and DateDiff(second,GETDATE(),closeDate) גדול שווה 0
Group By EventTypes.TypeID,eventType, data, logo, eventID, closeDate
order by priority
&nbsp
אני מקבל רשימת ארועים כאשר לכל ארוע יש תאריך סיום (closeDate).
אני מעוניין לקבל את כל הארועים, מקובצים לפי סוג ארוע (eventType או typeID - להבנתי זה היינו-הך) באופן שלא יהיו שתי שורות עם אותו סוג ארוע. את כל תאריכי הסגירה של אותו ארוע, אני מעוניין לקבל בשדה אחד באותה השורה, מופרדים בפסיקים, לדוגמא: בכל שורה הייתי רוצה שהערך בשדה closeDate, יהיה מהצורה הבאה: closeDate1,closeDate2,closeDate2
&nbsp
אשמח לכל עזרה בנושא.
תודה מראש!
 

גרי רשף

New member
שאלה מוזרה אך מעניינת

קודם כל- אני מבין שכך הוחלט: לוקחים קובץ טקסט, והופכים אותו לטבלה כך שכל מילה בשורה אחרת; ואני מניח שהשורות ממוספרות לפי סדר המילים במקור.
לא בטוח שיש בזה היגיון, אך לא אתווכח עם מה שהוחלט.
&nbsp
הייתי מנסה כך (פסאודו קוד):
|הקוד|With T As
(Select Word W0,
Lead(Word,1) W1,
Lead(Word,2) W2
From MyTbl)
Select *
From T
Where W0='I' And W1='love' And W2='you';|סקוד|
את השימוש ב-CTE אני מקווה שהבנת (הסט T המוגדר בתוך הסוגריים).
עם הפונקציה Lead שהסינטקס שלה יותר מורכב ולא כפי שמוצג כאן- מוצאים את המילה הבאה ואת זו שאחריה,
ואז צריך רק לוודא ששלוש המילים שוות למבוקש על פי הסדר.
&nbsp
אני מניח שאת משתמשת בגרסה 2012 או מתקדמת יותר, אחרת- נצטרך לחשוב על משהו אחר.
&nbsp
מקווה שעזרתי.
 

גרי רשף

New member
תצוגת הקוד השתבשה

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

pitoach

New member
זה מתאים למשפט של שלוש מילים

אבל אם יש לך משפט של 4 מילים או של 10 מילים או בצורה דינאמית צריך פתרון למשפט כלשהו, אז הפתרון הזה לא יעיל (אפשר לבוד עם שאילתה דינאמית אבל). ניראה לי הרבה יותר פשוט לעבוד עם for XML לשם חיבור המילים למשפט המקורי חזרה (פעולת UNSPLIT בעזרת For XML).
&nbsp
* בכל מקרה אני מסכים עם גרי, וגם אני לא מבין לפי התיאור כאן מה ההגיון בצורת העבודה הזו וניראה לי שיש הרבה מקום לתכנון מחודש של כל התהליך מהרעיון ועד ה DDL, לפני שעוברים לפתרון ברמת השאילתה.
 

אורית391

New member
חיפוש

מפרידים את המילים כדי שבמקרה של
i love.you
שיש נקודה החיפוש של הביטוי i love you אמור לא למצוא משפט כזה.
לגבי For XML איפה אפשר ללמוד את הנושא? אשמח לקישורים....
 

pitoach

New member
--->

1. התיאור שלך רק מחזק את זה שאין צורך בהפרדה מכיוון שאם מחפשים xxx yyy עם רווח, ויש לך במסד הנתונים xxx.yyy אז הביטוי לא ימצא! יכול להיות שהתכוונת הפוך, שדווקא הביטוי כן אמור להימצא במקרה כזה?
אם כן אז, זו אינה סיבה לבחירת פתרון כזה וכל מה שצריך זה לבצע חיפוש נכון (regex יכול להיות פתרון נהדר).
בכל מקרה, מה שאת אומרת רק מגביר את האפשרות לתכנון שכניראה צריך לשפר.
&nbsp
2. לגבי שימוש ב for xml תוכלי להתחיל לקרוא כאן:
https://www.google.co.il/search?q=SQL+Server+for+xml
&nbsp
3. את לא מספקת לנו שום מידע ענייני כדי לעזור לך, אלא רק פירורי שאלות על החלטות שכבר התקבלו. אנחנו לא יכולים לתת המלצה של מה יותר נכון עם המידע שיש לנו כאן.
* אנחנו צריכים להבין את התהליכים שאתם צריכים (יעדים ומטרות, אופן העבודה, וכו').
* אנחנו צריכים להבין על איזה סדרי גודל מדובר
* אנחנו צריכים להבין את מבנה מסד הנתונים שלכם כרגע
* אנחנו צריכים לבחון ולראות נתונים לדוגמה
&nbsp
אני מציע שוב להתחיל בלספק לנו DDL+DML
http://ariely.info/Blog/tabid/83/En...e-DDL-and-Data-Manipulation-Language-DML.aspx
 

pitoach

New member


 

אורית391

New member
השיטה הזאת זה בדיוק מה שאני צריכה אבל הבעיה שאין לי SQL 2012

אלא SQL 2008
יש פתרון לזה?
האם לא חסר ב SQL שלך את הביטוי OVER?
 

pitoach

New member
קיראי את ההודעה שלי מעל

אנחנו צריכים DDL+DML לפחות כדי להבין מה קורה כרגע אצלכם ולעזור בפתרון של שאיתה (פתרון של שאילתה עבור המצב הנוכחי באפיון שלכם!!! ולא בהכרח פתרון מיטבי הכולל שינוי תכנון)
 

גרי רשף

New member
אנסה לעזור

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

pitoach

New member
גרי, אולי אפשר להעלות לאתר חיצוני ולשים קישור?

 

pitoach

New member
נסיון להעלות את הקובץ של גרי

נסיון להעלות את הקובץ של גרי
 

אורית391

New member
זה מעולה! אבל במקרה של נקודה באמצע משפט זה לא עובד

I
love
.
you
זה לא עובד...למה?
 

גרי רשף

New member
פתרתי בעייה תיאורטית פשוטה כשהמציאות מסובכת..

נסי כך:
בבשני המקומות בהם יש שימוש בפונקציה CharIndex
החליפי את החלק השמאלי שלה (התצוגה כאן קצת משובשת)
CharIndex(' ',
בזה-
PatIndex('%[ .]%',
אני מקווה שזה יעבוד ושגם הבנת את הרעיון: בתוך הסוגריים המרובעים כתבי את כל התווים שעלולים להפריד בין מילים (מקף? פסיק? פסיק-נקודה? סימן שאלה?..).
 

אורית391

New member
ניסיתי את ב- CharIndex השני זה לא מתאים כי יש שם שרשור

של מחרוזת
PatIndex('%[ .]%',@S+' ',SpaceChar+1 )
זה לא עובר ב-SQL
 

גרי רשף

New member
לכל בעייה יש פתרון (ולהיפך)

יחד עם זאת זה קצת חורג מהיקף הסביר לתשובה כאן בפורום.
מדוע? מפני שהחוקים פתאום משתנים: לא מדובר רק בכך שהתו המפריד בין 2 מילים יכול להיות נקודה (זה סביר והצעתי לכך פתרון המבוסס על המקורי בשינוי קל), אלא שפתאום התו הזה (הנקודה) מתווסף לטבלה. הרי קודם לא הכנסת את הרווחים לטבלה, ואילו את הנקודה כן. לאלתר לזה פתרון כרוך בשינוי של כל הפתרון המקורי וכתיבתו מחדש, קצת גדול עלי, והפורום אמור להציע כיוון ולא פתרון סגור ארוז בדוק ונצור..
 

pitoach

New member
זו בריחה מהפתרון הפשוט והנכון כניראה! שימוש ב CLR

ובביטויים רגולריים ,אשר נותנים את אפשרות החיפוש באופן מיידי במשפט המקורי בלי צורך לבצע הפרדה למילים, ישירות מהמסמך המקורי.
&nbsp
גם אם כבר נמצאים במצב של הפרדה למילים אפשר פשוט ליצור טבלה נוספת של רשימ ת תווים שיכולים לשמש כהפרדה ואז על ידי JOIN פשוט לבצע סינון שלהם לפני שמבצעי את הפעולה של ההשוואה
>> אם התוים המפרידים הם רק רווח ונקודה אז לא הייתי יוצר טבלה חיצונית נפרדת, אבל ההרגשה של האפיון שמשתנה לנו כל רגע הוא שזה הפתרון שהייתי בוחר לשם גמישות. ה כמו בחיים האמיתיים כשעובדים מול לקוח. ג לקוחות לא מאופסים על מה שהן צריכים ורוצים והרבה פעמים צריך לאפשר גמישות לפחות עד שהאפיון ברור לכל הצדדים ואז אפשר לבצע איחוד ומיטוב של המערכת (לפעמים מהיסוד)
 
למעלה