פוסט זה מהווה המשך לפוסט הקודם בנושא. בחלק זה נכיר את העבודה הבסיסית עם הפונקציות – regexp_instr, regexp_substr,regexp_replace
regexp_instr
פונקציה זו, הפועלת בצורה דומה לפונקציית ה instr מחזירה מיקום של ביטוי בתוך טקסט.
נייצר טבלת דמו לפי הסינטקס הבא :
CREATE TABLE names AS SELECT rownum AS ID, last_name AS NAME FROM hr.employees ; Table created
ונציג את מיקום התו 't' בחמשת העובדים הראשונים
SELECT name , regexp_instr(name ,'t') FROM names WHERE rownum <= 5 ; NAME REGEXP_INSTR(NAME,'T') ------------------------- ---------------------- Abel 0 Ande 0 Atkinson 2 Austin 4 Baer 0
נציג את מיקום התו 'e' בחמשת העובדים הראשונים
SELECT name , regexp_instr(name ,'e') FROM names WHERE rownum <= 5 ; NAME REGEXP_INSTR(NAME,'E') ------------------------- ---------------------- Abel 3 Ande 4 Atkinson 0 Austin 0 Baer 3
נציג את מיקום הרצף 'ae'
SELECT name , regexp_instr(name ,'ae') FROM names WHERE rownum <= 5 ; NAME REGEXP_INSTR(NAME,'AE') ------------------------- ----------------------- Abel 0 Ande 0 Atkinson 0 Austin 0 Baer 2
נשתמש ב '[ ]' כדי להציג את מיקום התווים 'a' או 'e'
SELECT name , regexp_instr(name ,'[ae]') FROM names WHERE rownum <= 5 ; NAME REGEXP_INSTR(NAME,'[AE]') ------------------------- ------------------------- Abel 3 Ande 4 Atkinson 0 Austin 0 Baer 2
נציג שוב את מיקום התווים 'a' או 'e' כך ש
· בעמודה הראשונה – החיפוש יעשה החל מהתו הראשון
· בעמודה השניה – החיפוש יעשה החל מהתו הרביעי
SELECT id, name , regexp_instr(name ,'[ae]') AS COL_1, regexp_instr(name ,'[ae]',4) AS COL_2 FROM names WHERE id BETWEEN 10 AND 20 ; ID NAME COL_1 COL_2 ---------- ------------------------- ------ ------ 10 Bernstein 7 11 Bissot 0 0 12 Bloom 0 0 13 Bull 0 0 14 Cabrio 0 15 Cambrault 6 16 Cambrault 6 17 Chen 0 18 Chung 0 0 19 Colmenares 5 20 Davies 5 11 rows selected.
נציג שוב את מיקום התווים 'a' או 'e' כך ש
· בעמודה הראשונה – החיפוש יעשה החל מהתו הראשון
· בעמודה השניה – החיפוש יעשה החל מהתו הרביעי
· בעמודה השלישית – החיפוש יעשה החל מהתו הרביעי ויציג את מיקום המופע השני של התווים 'a' או 'e'
SELECT id, name , regexp_instr(name ,'[ae]') AS COL_1, regexp_instr(name ,'[ae]',4) AS COL_2, regexp_instr(name ,'[ae]',4,2) AS COL_3 FROM names WHERE id BETWEEN 10 AND 20 ; ID NAME COL_1 COL_COL_3 ---------- ------------------------- ------ ------ ------ 10 Bernstein 0 11 Bissot 0 0 0 12 Bloom 0 0 0 13 Bull 0 0 0 14 Cabrio 0 0 15 Cambrault 0 16 Cambrault 0 17 Chen 0 0 18 Chung 0 0 0 19 Colmenares 7 20 Davies 0 11 rows selected.
נמשיך לפתח את הקוד ונציג שוב את מיקום התווים 'a' או 'e' כך ש
· בעמודה הראשונה – החיפוש יעשה החל מהתו הראשון
· בעמודה השניה – החיפוש יעשה החל מהתו הרביעי
· בעמודה השלישית – החיפוש יעשה החל מהתו הרביעי ויציג את מיקום המופע השני של התווים 'a' או 'e'
· בעמודה הרביעית – החיפוש יעשה החל מהתו הרביעי ויציג את מיקום המופע השני של התווים 'a' או 'e' (הדיפולט, זהה לעמודה הקודמת)
· בעמודה החמישית – החיפוש יעשה החל מהתו הרביעי ויציג את מיקום המופע השני + 1 של התווים 'a' או 'e'
· בעמודה השישית – החיפוש יעשה החל מהתו הרביעי ויציג את מיקום המופע השני של התווים 'a' או 'e' כאשר החיפוש עצמו לא יהיה Case Sensitive
SELECT id, name , regexp_instr(name ,'[ae]') AS COL_1, regexp_instr(name ,'[ae]',4) AS COL_2, regexp_instr(name ,'[ae]',4,2) AS COL_3, regexp_instr(name ,'[ae]',4,2,0) AS COL_4, regexp_instr(name ,'[ae]',4,2,1) AS COL_5, 8 regexp_instr(name ,'[ae]',4,2,0, 'i') AS COL_6 9 FROM names 10 WHERE id BETWEEN 10 AND 20 ; ID NAME COL_1 COL_COL_COL_COL_COL_6 ---------- ----------- ------ ------ ------ ------ ------ ------ 10 Bernstein 0 0 0 0 11 Bissot 0 0 0 0 0 0 12 Bloom 0 0 0 0 0 0 13 Bull 0 0 0 0 0 0 14 Cabrio 0 0 0 0 0 15 Cambrault 0 0 0 0 16 Cambrault 0 0 0 0 17 Chen 0 0 0 0 0 18 Chung 0 0 0 0 0 0 19 Colmenares 8 7 20 Davies 0 0 0 0 11 rows selected.
regexp_substr
פונקציה זו הפועלת בדומה לפונקציית ה substr מחזירה תת מחרוזת מתוך טקסט.
נייצר טבלת דמו ונאכלס אותה לפי הסינטקס הבא :
DROP TABLE text ; Table dropped. CREATE TABLE text (text_col varchar2(50)) ; Table created. INSERT INTO text VALUES ('text 324 text 45321 text 12232'); 1 row created. SELECT * FROM text ; TEXT_COL -------------------------------------------------- text 324 text 45321 text 12232
נציג את הספרה הראשונה מתוך הטקסט
SELECT regexp_substr(text_col , '[0-9]') AS COL_1 FROM text ; COL_1 -------------------------------------------------- 3
נציג את שתי הספרות הראשונות מתוך הטקסט
SELECT regexp_substr(text_col , '[0-9]{2}') AS COL_1 FROM text ; COL_1 -------------------------------------------------- 32
ניתן להשתמש בסימן ה '+' כדי להציג את כל הספרות הקיימות במופע הראשון
SELECT regexp_substr(text_col , '[0-9]+') AS COL_1 FROM text ; COL_1 -------------------------------------------------- 324
ננחה את חיפוש הספרות להתבצע החל מהמיקום ה 9
SELECT regexp_substr(text_col , '[0-9]+' , 9) AS COL_1 FROM text ; COL_1 ------------------------------------------ 45321
ננחה את חיפוש הספרות להתבצע החל מהמיקום ה 9 ולהחזיר את מופע הספרות הראשון (זהה לדוגמא הקודמת)
SELECT regexp_substr(text_col , '[0-9]+' , 9 , 1) AS COL_1 FROM text ; COL_1 ------------------------------------------ 45321
ננחה את חיפוש הספרות להתבצע החל מהמיקום ה 9 ולהחזיר את מופע הספרות השני
SELECT regexp_substr(text_col , '[0-9]+' , 9 , 2) AS COL_1 FROM text ; COL_1 ------------------------------------------ 12232
regexp_replace
לסיום נעשה היכרות בסיסית עם פונקצית ה regexp_replace אשר בדומה לפונצקית ה replace מבצעת החלפות ביטויים בתוך מחרוזת.
SELECT * FROM text ; TEXT_COL ------------------------------ text 324 text 45321 text 12232
בדוגמא זו אנו מחליפים את כל האותיות בסימן ה '$'
SELECT regexp_replace(text_col , '[a-z]' , '$') AS COL_1 FROM text ; COL_1 ------------------------------ $$$$ 324 $$$$ 45321 $$$$ 12232
בדוגמא הבאה אנו מחליפים את כל האותיות בסימן ה '$' החל מהתו התשיעי
SELECT regexp_replace(text_col , '[a-z]' , '$' , 9) AS COL_1 FROM text ; COL_1 ------------------------------ text 324 $$$$ 45321 $$$$ 12232