החל מגרסת 10g אורקל החלה לתמוך בביטויים רגולריים באמצעות הפונקציות: regexp_instr, regexp_substr, regexp_like, regexp_replace, אותן ניתן ליישם כחלק מקוד ה SQL וה PLSQL.
כפי שנראה בדוגמאות הבאות, פונקציות אלו מאפשרות ביטוי נח ופשוט של תבניות טקסט (Patterns), ויוצרות יריעה עצומה של יכולות בעבודה מול ביטויים מחרוזתיים.
בפוסט זה נתמקד בפונקצית regexp_like.
REGEXP_LIKE
פונקציה זו עובדת בדומה לאופרטור ה LIKE – חיפוש על פי תבניות. השוני מתבטא בכך שפונקציית ה REGEXP_LIKE עובדת עם ביטויים מורכבים בעוד LIKE מול תבניות פשוטות.
נייצר טבלה המורכבת ממחרוזות שונות לפי הסינטקס הבא –
RAM > CREATE TABLE names 2 AS 3 SELECT last_name AS NAME 4 FROM hr.employees 5 ORDER BY salary ; Table created.
ונתחיל בהדגמא פשוטה – הצגת כל העובדים אשר קיים בשמם התו 'z'
RAM > -- Demo 1 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , 'z') AND rownum <= 10;
NAME
————————-
Lorentz
Gietz
Ozer
Errazuriz
נמשיך ונציג את כל העובדים אשר קיים בשמם רצף התווים 'be'
RAM > RAM > -- Demo 2 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , 'be') AND rownum <= 10;
NAME
————————-
Abel
Greenberg
כעת נעשה שימוש בתו '|' כדי להציג את כל העובדים אשר קיים בשמם רצף התווים 'be' או 'ae'
RAM > -- Demo 3 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , 'be|ae') AND rownum <= 10;
NAME
————————-
Baer
Abel
Raphaely
Greenberg
ניתן להשתמש בתו 'c' כדי לציין שהחיפוש יהיה Case Sensitive (הדיפולט)
RAM > -- Demo 4 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , 'be|ae' , 'c' ) AND rownum <= 10;
NAME
————————-
Baer
Abel
Raphaely
Greenberg
וניתן להשתמש בתו 'i' כדי לציין שהחיפוש יהיה לא Case Sensitive
RAM > -- Demo 5 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , 'be|ae' , 'i' ) AND rownum <= 10;
NAME
————————-
Bell
Bernstein
Baer
Abel
Raphaely
Greenberg
6 rows selected.
ניתן להשתמש בתו '^' כדי לציין את תחילת המילה, בדוגמא הבאה נשתמש בו עבור רצף התווים 'be'.
RAM > -- Demo 6 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , '^be|ba' , 'i' ) AND rownum <= 10;
NAME
————————-
Baida
Bell
Pataballa
Banda
Bates
Bernstein
Baer
7 rows selected.
ניתן להשתמש בו כדי לציין את תחילת המילה עבור הרצף 'be' והרצף 'ba'
RAM > -- Demo 7 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , '^be|^ba' , 'i' ) AND rownum <= 10;
NAME
————————-
Baida
Bell
Banda
Bates
Bernstein
Baer
6 rows selected.
לסיום – ניתן להשתמש בתו '$' כדי לציין את סיומת המילה. בדוגמא זו אנו מציגים את העובדים אשר שמם מסתיים ברצף 'es' או ברצף 'er'
RAM > -- Demo 8 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , 'es$|er$' , 'i' ) AND rownum <= 10;
NAME
————————-
Philtanker
Colmenares
Jones
Gates
Davies
Nayer
Stiles
Dellinger
Bates
Baer
10 rows selected.
כעת נעבור לצמד תווים נוסף המשמש אותנו בביטויים הרגולריים – [ ].
בדוגמא הבאה נציג את כל העובדים אשר בשמם קיימים התווים 'j' או 'z'
RAM > -- Demo 1 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , '[jz]') AND rownum <= 10;
NAME
————————-
Rajs
Lorentz
Gietz
Ozer
Errazuriz
וכעת נציג את כל העובדים אשר בשמם קיימים התווים 'b' או 'z' או 'E' (זכרו – הדיפולט הוא Case Sensitive)
RAM > -- Demo 2 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , '[bzE]') AND rownum <= 10;
NAME
————————-
Tobias
Cabrio
Everett
Lorentz
Pataballa
Ernst
Cambrault
Gietz
McEwen
Cambrault
נריץ שוב את אותה שאילתה, הפעם נציין כי החיפוש לא יהיה Case Sensitive
RAM > -- Demo 3 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , '[bzE]' , 'i') AND rownum <= 10;
NAME
————————-
Philtanker
Markle
Gee
Perkins
Colmenares
Patel
OConnell
Mikkilineni
Seo
Tobias
10 rows selected.
דוגמא נוספת – כל העובדים אשר האותיות 'a', 'b' או 'c' קיימות בשמם
RAM > -- Demo 4 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , '[abc]') AND rownum <= 10;
NAME
————————-
Philtanker
Markle
Landry
Colmenares
Patel
Vargas
Sullivan
Marlow
Grant
Matos
10 rows selected.
לסיום, במקום לכתוב את הערכים 'a','b','c' ניתן לציין אותם כטווח ('a'-'c')
RAM > -- Demo 5 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , '[a-c]') AND rownum <= 10;
NAME
————————-
Philtanker
Markle
Landry
Colmenares
Patel
Vargas
Sullivan
Marlow
Grant
Matos
10 rows selected.
נמשיך ונציג את כל העובדים אשר בשמם קיים אחד התווים בטווח d-g ולאחריו מופיע התו 'a'
RAM > -- Demo 1 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , '[d-g]a') AND rownum <= 10;
NAME
————————-
Vargas
Baida
Fleaur
Banda
נציג את כל העובדים אשר בשמם קיים אחד התווים בטווח d-g, לאחריו מופיע רווח, ולאחריו התו 'H'
RAM > -- Demo 2 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , '[d-g] H') AND rownum <= 10;
NAME
————————-
De Haan
נוכל להשתמש בתו '.' כדי לייצג תו כלשהו, בדוגמא הבאה אנו מציגים את כל העובדים אשר בשמם אחד התווים בטווח b-g, לאחריו מופיע תו כלשהו, ולאחריו התו 'a'
RAM > -- Demo 3 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , '[b-g].[a]') AND rownum <= 10;
NAME
————————-
Colmenares
Tobias
McCain
Sarchand
Sewall
Cambrault
Sciarra
Cambrault
8 rows selected.
כמו כן, נוכל להשתמש בתו '.' כדי לייצג יותר מתו אחד, בדוגמא הבאה אנו מציגים את כל העובדים אשר בשמם אחד התווים בטווח b-g, לאחריו מופיעים שני תווים, ולאחר מכן התו 'a'
RAM > -- Demo 4 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , '[b-g]..[a]') AND rownum <= 10;
NAME
————————-
De Haan
Kochhar
לסיום – ניתן להשתמש בצמד התווים { } כדי לייצג מספר מופעים, לדוגמא – הצגת כל העובדים אשר בשמם קיימים שני תווי 'a' רציפים
RAM > -- Demo 5 RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , '[a]{2}') AND rownum <= 10;
NAME
————————-
De Haan
דוגמא נוספת – הצגת כל העובדים אשר בשמם קיימים שני תווי 'o' רציפים
RAM > -- Demo 6 RAM > -- Exactly 2 repetitions of the letter o RAM > SELECT * 2 FROM names 3 WHERE regexp_like (name , '[o]{2}') AND rownum <= 10;
NAME
————————-
Khoo
Bloom
כעת נראה מעט עבודה מול מספרים, נייצר טבלה ונכניס אליה רשומות לפי הסינטקס הבא –
RAM > CREATE TABLE text_tab 2 (text varchar2(15)); Table created. RAM > RAM > INSERT INTO text_tab VALUES ('432sometext'); 1 row created. RAM > INSERT INTO text_tab VALUES ('157sometext'); 1 row created. RAM > INSERT INTO text_tab VALUES ('32sometext'); 1 row created. RAM > INSERT INTO text_tab VALUES ('9943sometext'); 1 row created. RAM > INSERT INTO text_tab VALUES ('sometext'); 1 row created. RAM > INSERT INTO text_tab VALUES ('sometext 657'); 1 row created. RAM > INSERT INTO text_tab VALUES ('some 5678text'); 1 row created. RAM > INSERT INTO text_tab VALUES ('sometext 8675'); 1 row created. RAM > INSERT INTO text_tab VALUES ('sometext 5876'); 1 row created.
אלו הערכים בטבלה
RAM > SELECT * FROM text_tab ; TEXT --------------- 432sometext 157sometext 32sometext 9943sometext sometext sometext 657 some 5678text sometext 8675 sometext 5876 9 rows selected.
נציג את כל הערכים בטבלה אשר מכילים את אחת הספרות בטווח של 0-9
RAM > SELECT * 2 FROM text_tab 3 WHERE regexp_like (text , '[0-9]') ;
TEXT
—————
432sometext
157sometext
32sometext
9943sometext
sometext 657
some 5678text
sometext 8675
sometext 5876
8 rows selected.
נציג את כל הערכים בטבלה אשר מכילים את אחת הספרות בטווח של 5-8
RAM > SELECT * 2 FROM text_tab 3 WHERE regexp_like (text , '[5-8]') ;
TEXT
—————
157sometext
sometext 657
some 5678text
sometext 8675
sometext 5876
נציג את כל הערכים בטבלה אשר מכילים בארבעה מופעים את אחת הספרות בטווח של 5-8, (ספרה ראשונה בין 5-8, ספרה שניה בין 5-8, ספרה שלישית בין 5-8, ספרה רביעית בין 5-8)
RAM > SELECT * 2 FROM text_tab 3 WHERE regexp_like (text , '[5-8]{4}') ;
TEXT
—————
some 5678text
sometext 8675
sometext 5876
ולסיום – נציג את כל הערכים בטבלה אשר מכילים בארבעה מופעים את אחת הספרות בטווח של 5-8 ולאחריהם מופיעה אות כלשהי
RAM > SELECT * 2 FROM text_tab 3 WHERE regexp_like (text , '[5-8]{4}[a-z]') ;
TEXT
—————
some 5678text