רג'קס בMYSQL
-
ממה שחיפשתי אין פיתרון מובנה לבעייה הזו, אשמח לעזרה באילתור פיתרון.
יש לי שני טבלאות, אחת בה נרשמות השיחות נכנסות (מספר מחייג ומחוייג ותאריך), ואחת עם נתונים של כל מספר טלפון (מספר, כתובת מייל, וכמה הגדרות אישיות)
אני רוצה לעשות SELECT עם LEFT JOIN שמצרף על כל שורה של שיחה נכנסת, את השם של המתקשר.
הבעייה שהמבנה של המספר שונה. בטבלא של המידע, כל מספר כתוב בצורה נכונה: 052769XXXX
אבל בטבלא של השיחות, יש כמה אפשרויות052769XXXX 0052769XXXX 52769XXXX 0097252769XXXX 97252769XXXX +97252769XXXX
מה שצריך לעשות, זה למחוק כל הפלוסים וה0 וה972 (לפי הסדר הזה) מתחילת המספר, ואז להצמיד לו 0 בהתחלה
כבונוס, צריך גם להתייחס למספרי חול, שהם לא מתחילים ב0, ולכן צריך לעשות להם הטיפול הנל, רק בלי להצמיד 0, וזה כאשר המספר הוא יותר גדול מ9 ספרותאני רואה שיש פונקציה בMYSQL 8 שנקראת REGEXP_SUBSTR. אבל מסובך לשדרג עכשיו אחרי שהכל כבר בנוי ואני חושש שיעשה בלאגן (או שאולי זה חשש שווא?)
אם למישהו יש רעיון לפיתרון פשוט, אודה לו מאוד
-
@שואף השאלה למה אתה פונה לכיוון הזה, שאני מניח שגם אם יימצא הפתרון, זה יהיה בזבוז משאבים בכל שאילתה.
למה שלא תעדכן את הנתונים בצורה תקנית פ"א בטבלה.
ומהיום לדאוג שהקוד שמבצע את הרישום בטבלה הראשונה יעשה את זה בצורה תקנית, וימחוק את כל התווים הנ"ל?או שבאמת אתה רוצה לעשות את השאילתא הזאת רק פעם אחת?
-
תצרף בשאילתא לפי 8 הספרות הימניות.
-
@WWW אמר ברג'קס בMYSQL:
למה שלא תעדכן את הנתונים בצורה תקנית פ"א בטבלה.
צודק לחלוטין
למעשה זה קצת מה שאני רוצה לעשות.
לא יודע איך אתם מנהלים את הCDR, אבל הגעתי למסקנה כזו
יש X שרתי אסטריסק, כל אחד מנהל CDR עצמאי בLOCALHOST
וכל חצי שעה, יש משימה מתוזמנת שלוקחת את כל הרישומים החדשים ומכניס אותם למסד נתונים המרכזי שעל השרת קבצים.
ככה אני חוסך שלא צריך לגשת בכל שיחה לשרת המרכזי, ומצד שני הכל נמצא עליו.אז הייתי רוצה לא לגעת בCDR הלוקלי, אבל במרכזי להכניס את הנתונים בצורה מתוקנת. ובשביל זה, בשאילתא המתוזמנת כל חצי שעה, אני צריך לתקן את השדה של המספר מחייג כנל. ובשביל זה אני צריך את הפיתרון לבעייה.
-
@שואף אמר ברג'קס בMYSQL:
וכל חצי שעה, יש משימה מתוזמנת שלוקחת את כל הרישומים החדשים ומכניס אותם למסד נתונים המרכזי שעל השרת קבצים.
ובשביל זה, בשאילתא המתוזמנת כל חצי שעה, אני צריך לתקן את השדה של המספר מחייג כנל. ובשביל זה אני צריך את הפיתרון לבעייה.
איך אתה מפעיל את השאילתה, עם איזה משימה? אני חושב שתעשה את זה עם PHP וכדו', וחסל.
-
@WWW אמר ברג'קס בMYSQL:
אני חושב שתעשה את זה עם PHP
כן זה מה שאני חושב עכשיו, כנראה שהכי נכון לעשות את זה ככה וזהו
@dovid אמר ברג'קס בMYSQL:
אם זה בSQL תשתמש בREGEXP_REPLACE להגיע לתוצאה הרצויה,
רק מMYSQL 8
-
למי שהתעניין.. זהו הפיתרון, להריץ לולאה (כמובן עם &) על כל המערך, ולקרוא לפונקציה הזו על כל שדה של מספר
function formatIsraeliNumber($number) { $return = preg_replace('#\+?|0*|(972)?(\d+)#', '$2', $number); return (strlen($return) < 10 ? '0': '').$return; }
-
בPHP אפשר לעשות קבוצות עם שם ולא סתם מספרים:
https://regex101.com/r/Eql3kN/3
ואגב ראית שיש להם שמה יוצר קוד לPHP:
https://regex101.com/r/Eql3kN/1/codegen?language=php -
@dovid תודה
אבל עדיף הראשון, לא הבנתי למה (בשעה הזו אל תצפה ממני יותר מידי..), אבל על המספר הזה +1564527691234 הראשון מוחק את + והשני לא
בסוף ראיתי שה0 צריך רק אם המספר הוא פחות מ10 תווים, לכן אני כבר משתמש בPHP בשביל זה (או שתשלוף מהכובע רג'קס שיוסיף רק אם זה פחות מ10 תווים) -
@dovid אמר ברג'קס בMYSQL:
בPHP אפשר לעשות קבוצות עם שם ולא סתם מספרים:
https://regex101.com/r/Eql3kN/3
ואגב ראית שיש להם שמה יוצר קוד לPHP:
https://regex101.com/r/Eql3kN/1/codegen?language=phpמקסים, לא הכרתי. תודה רבה
-
במספר כזה (חו"ל) הייתי רוצה לקבל אותו כמו שהוא רק בלי ה+ בהתחלה
פשוט שמספרים ישראלים צריכים להגיע בתבנית ישראלית, 9 או 10 ספרות.
ממילא אם אחרי הרג'קס שהוריד להם את ה0 בהתחלה, נשאר 8 או 9 ספרות, זה מספר ישראלי וצריך להוסיף לו 0 בהתחלה
אם לא, אז להחזיר אותו כמו שהואאגב, אל תצחק יותר מידי אבל דווקא כתבתי משהו חמוד בMYSQL
SELECT src, CASE WHEN LENGTH(src) < 11 THEN (CASE WHEN SUBSTR(src, -9, 1) IN(5,7) THEN CONCAT('0', SUBSTR(src, -9)) ELSE CONCAT('0', SUBSTR(src, -8)) END) ELSE src END AS src2
רק זה לא היה נכון כי אני מודד אורך המספר לפני הטיפול, ואז הוא יכול להיות ישראלי ויותר מ10 ספרות