Oracle PL/SQL Tutorial/Regular Expressions Functions/REGEXP LIKE

Материал из SQL эксперт
Перейти к: навигация, поиск

Asking for the presence of a "g" or a "p"

The "%" sign metacharacter matches zero, one, or more characters.



   <source lang="sql">

SQL> -- create demo table SQL> create table myTable(

 2    id           NUMBER(2),
 3    value        VARCHAR(50)
 4  );

Table created. SQL> SQL> insert into myTable(id, value)values(1,"1234 4th St. Vancouver"); 1 row created. SQL> insert into myTable(id, value)values(2,"4 Maple Ct. New York"); 1 row created. SQL> insert into myTable(id, value)values(3,"4321 Green Blvd. London"); 1 row created. SQL> insert into myTable(id, value)values(4,"33 Third St. Toronto"); 1 row created. SQL> insert into myTable(id, value)values(5,"One First Drive. Queen"); 1 row created. SQL> insert into myTable(id, value)values(6,"1664 1/2 Springhill Ave"); 1 row created. SQL> insert into myTable(id, value)values(7,"665 Fall Ave. Linken"); 1 row created. SQL> SQL> select * from mytable;

       ID VALUE

--------------------------------------------------
        1 1234 4th St. Vancouver
        2 4 Maple Ct. New York
        3 4321 Green Blvd. London
        4 33 Third St. Toronto
        5 One First Drive. Queen
        6 1664 1/2 Springhill Ave
        7 665 Fall Ave. Linken

7 rows selected. SQL> SQL> SQL> SELECT value

 2  FROM myTable
 3  WHERE value LIKE("%g%")OR value LIKE ("%p%");

VALUE


4 Maple Ct. New York 1664 1/2 Springhill Ave SQL> SQL> SQL> drop table myTable; Table dropped. SQL> SQL></source>


Asking for the presence of a "g" or a "p" with REGEXP_LIKE

The order of occurrence of [gp] or [pg] is irrelevant.



   <source lang="sql">

SQL> -- create demo table SQL> create table myTable(

 2    id           NUMBER(2),
 3    value        VARCHAR(50)
 4  );

Table created. SQL> SQL> insert into myTable(id, value)values(1,"1234 4th St. Vancouver"); 1 row created. SQL> insert into myTable(id, value)values(2,"4 Maple Ct. New York"); 1 row created. SQL> insert into myTable(id, value)values(3,"4321 Green Blvd. London"); 1 row created. SQL> insert into myTable(id, value)values(4,"33 Third St. Toronto"); 1 row created. SQL> insert into myTable(id, value)values(5,"One First Drive. Queen"); 1 row created. SQL> insert into myTable(id, value)values(6,"1664 1/2 Springhill Ave"); 1 row created. SQL> insert into myTable(id, value)values(7,"665 Fall Ave. Linken"); 1 row created. SQL> SQL> select * from mytable;

       ID VALUE

--------------------------------------------------
        1 1234 4th St. Vancouver
        2 4 Maple Ct. New York
        3 4321 Green Blvd. London
        4 33 Third St. Toronto
        5 One First Drive. Queen
        6 1664 1/2 Springhill Ave
        7 665 Fall Ave. Linken

7 rows selected. SQL> SQL> SQL> SELECT value

 2  FROM myTable
 3  WHERE REGEXP_LIKE(value,"[gp]");

VALUE


4 Maple Ct. New York 1664 1/2 Springhill Ave SQL> SQL> SQL> drop table myTable; Table dropped. SQL> SQL></source>


Regexp_Like

The complete function definition is:

REGEXP_LIKE(String to search, Pattern, [Parameters]),

where

String to search, Pattern, and Parameters are the same as for REGEXP_INSTR.

As with REGEXP_INSTR, the Parameters argument is usually used only in special situations.

18. 3. REGEXP_LIKE 18. 3. 1. <A href="/Tutorial/Oracle/0360__Regular-Expressions-Functions/REGEXPLIKExpatternmatchoptionsearchsxfortheregularexpressionpattern.htm">REGEXP_LIKE(x, pattern [, match_option]) searchs x for the regular expression pattern.</a> 18. 3. 2. Regexp_Like 18. 3. 3. <A href="/Tutorial/Oracle/0360__Regular-Expressions-Functions/Askingforthepresenceofagorap.htm">Asking for the presence of a "g" or a "p"</a> 18. 3. 4. <A href="/Tutorial/Oracle/0360__Regular-Expressions-Functions/AskingforthepresenceofagorapwithREGEXPLIKE.htm">Asking for the presence of a "g" or a "p" with REGEXP_LIKE</a> 18. 3. 5. <A href="/Tutorial/Oracle/0360__Regular-Expressions-Functions/RetrievesemployeeswhosefirstnamestartswithJorj.htm">Retrieves employees whose first name starts with J or j.</a> 18. 3. 6. <A href="/Tutorial/Oracle/0360__Regular-Expressions-Functions/regexplikecommentsfazi.htm">regexp_like(comments, " f[a-z]* ","i")</a> 18. 3. 7. <A href="/Tutorial/Oracle/0360__Regular-Expressions-Functions/regexplikecomments8.htm">regexp_like(comments, "([^ ]+ ){8,}")</a> 18. 3. 8. <A href="/Tutorial/Oracle/0360__Regular-Expressions-Functions/Usingregexplikecommentsalnumpunctspace8.htm">Using regexp_like(comments, "([[:alnum:]+[:punct:]]+space:+){8,}")</a>

regexp_like(comments, "([^ ]+ ){8,}")

   <source lang="sql">

SQL> SQL> create table history

 2  ( empno      NUMBER(4)
 3  , beginyear  NUMBER(4)
 4  , begindate  DATE
 5  , enddate    DATE
 6  , deptno     NUMBER(2)
 7  , msal       NUMBER(6,2)
 8  , comments   VARCHAR2(60)
 9  ) ;

Table created. SQL> SQL> SQL> SQL> insert into history values (9,2000,date "2000-01-01",date "2002-01-02",40, 950,"history for 9"); 1 row created. SQL> insert into history values (8,2000,date "2000-01-02", NULL ,20, 800,""); 1 row created. SQL> insert into history values (7,1988,date "2000-01-06",date "2002-01-07",30,1000,""); 1 row created. SQL> insert into history values (6,1989,date "2000-01-07",date "2002-01-12",30,1300,""); 1 row created. SQL> insert into history values (5,1993,date "2000-01-12",date "2002-01-10",30,1500,"history for 5"); 1 row created. SQL> insert into history values (4,1995,date "2000-01-10",date "2002-01-11",30,1700,""); 1 row created. SQL> insert into history values (3,1999,date "2000-01-11", NULL ,30,1600,""); 1 row created. SQL> insert into history values (2,1986,date "2000-01-10",date "2002-01-08",20,1000,"history for 2"); 1 row created. SQL> insert into history values (1,1987,date "2000-01-08",date "2002-01-01",30,1000,"history for 1"); 1 row created. SQL> insert into history values (7,1989,date "2000-01-01",date "2002-05-12",30,1150,"history for 7"); 1 row created. SQL> SQL> SQL> SQL> SQL> select comments

 2  from   history
 3  where  regexp_like(comments, "([^ ]+ ){8,}");

no rows selected SQL> SQL> drop table history; Table dropped.</source>


regexp_like(comments, " f[a-z]* ","i")

   <source lang="sql">

SQL> SQL> create table history

 2  ( empno      NUMBER(4)
 3  , beginyear  NUMBER(4)
 4  , begindate  DATE
 5  , enddate    DATE
 6  , deptno     NUMBER(2)
 7  , msal       NUMBER(6,2)
 8  , comments   VARCHAR2(60)
 9  ) ;

Table created. SQL> SQL> SQL> SQL> insert into history values (9,2000,date "2000-01-01",date "2002-01-02",40, 950,"history for 9"); 1 row created. SQL> insert into history values (8,2000,date "2000-01-02", NULL ,20, 800,""); 1 row created. SQL> insert into history values (7,1988,date "2000-01-06",date "2002-01-07",30,1000,""); 1 row created. SQL> insert into history values (6,1989,date "2000-01-07",date "2002-01-12",30,1300,""); 1 row created. SQL> insert into history values (5,1993,date "2000-01-12",date "2002-01-10",30,1500,"history for 5"); 1 row created. SQL> insert into history values (4,1995,date "2000-01-10",date "2002-01-11",30,1700,""); 1 row created. SQL> insert into history values (3,1999,date "2000-01-11", NULL ,30,1600,""); 1 row created. SQL> insert into history values (2,1986,date "2000-01-10",date "2002-01-08",20,1000,"history for 2"); 1 row created. SQL> insert into history values (1,1987,date "2000-01-08",date "2002-01-01",30,1000,"history for 1"); 1 row created. SQL> insert into history values (7,1989,date "2000-01-01",date "2002-05-12",30,1150,"history for 7"); 1 row created. SQL> SQL> SQL> select regexp_replace(comments, " f[a-z]* "," ? ",1,1,"i")

 2  from   history
 3  where  regexp_like(comments, " f[a-z]* ","i");

REGEXP_REPLACE(COMMENTS,"F[A-Z]*","?",1,1,"I")


history ? 9 history ? 5 history ? 2 history ? 1 history ? 7 SQL> SQL> drop table history; Table dropped. SQL></source>


REGEXP_LIKE(x, pattern [, match_option]) searchs x for the regular expression pattern.

You can provide an optional match_option string to indicate the default matching.

  1. "c", which specifies case sensitive matching (default).
  2. "i", which specifies case insensitive matching.
  3. "n", which allows you to use the match-any-character operator.
  4. "m", which treats x as multiple line.

The following example retrieves employees whose date of birth is between 1995 and 1998 using REGEXP_LIKE():



   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table Employee(

 2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
 3    First_Name         VARCHAR2(10 BYTE),
 4    Last_Name          VARCHAR2(10 BYTE),
 5    Start_Date         DATE,
 6    End_Date           DATE,
 7    Salary             Number(8,2),
 8    City               VARCHAR2(10 BYTE),
 9    Description        VARCHAR2(15 BYTE)
10  )
11  /

Table created. SQL> SQL> -- prepare data SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2               values ("01","Jason",    "Martin",  to_date("19960725","YYYYMMDD"), to_date("20060725","YYYYMMDD"), 1234.56, "Toronto",  "Programmer")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("02","Alison",   "Mathews", to_date("19760321","YYYYMMDD"), to_date("19860221","YYYYMMDD"), 6661.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("03","James",    "Smith",   to_date("19781212","YYYYMMDD"), to_date("19900315","YYYYMMDD"), 6544.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("04","Celia",    "Rice",    to_date("19821024","YYYYMMDD"), to_date("19990421","YYYYMMDD"), 2344.78, "Vancouver","Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("05","Robert",   "Black",   to_date("19840115","YYYYMMDD"), to_date("19980808","YYYYMMDD"), 2334.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("06","Linda",    "Green",   to_date("19870730","YYYYMMDD"), to_date("19960104","YYYYMMDD"), 4322.78,"New York",  "Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("07","David",    "Larry",   to_date("19901231","YYYYMMDD"), to_date("19980212","YYYYMMDD"), 7897.78,"New York",  "Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("08","James",    "Cat",     to_date("19960917","YYYYMMDD"), to_date("20020415","YYYYMMDD"), 1232.78,"Vancouver", "Tester")
 3  /

1 row created. SQL> SQL> SQL> SQL> -- display data in the table SQL> select * from Employee

 2  /

ID FIRST_NAME LAST_NAME START_DAT END_DATE SALARY CITY DESCRIPTION


---------- ---------- --------- --------- ---------- ---------- ---------------

01 Jason Martin 25-JUL-96 25-JUL-06 1234.56 Toronto Programmer 02 Alison Mathews 21-MAR-76 21-FEB-86 6661.78 Vancouver Tester 03 James Smith 12-DEC-78 15-MAR-90 6544.78 Vancouver Tester 04 Celia Rice 24-OCT-82 21-APR-99 2344.78 Vancouver Manager 05 Robert Black 15-JAN-84 08-AUG-98 2334.78 Vancouver Tester 06 Linda Green 30-JUL-87 04-JAN-96 4322.78 New York Tester 07 David Larry 31-DEC-90 12-FEB-98 7897.78 New York Manager 08 James Cat 17-SEP-96 15-APR-02 1232.78 Vancouver Tester 8 rows selected. SQL> SQL> SQL> SQL> SELECT id, first_name, last_name, start_date FROM employee

 2  WHERE REGEXP_LIKE(TO_CHAR(start_date, "YYYY"), "^199[5-8]$");

ID FIRST_NAME LAST_NAME START_DAT


---------- ---------- ---------

01 Jason Martin 25-JUL-96 08 James Cat 17-SEP-96 SQL> SQL> SQL> SQL> -- clean the table SQL> drop table Employee

 2  /

Table dropped. SQL></source>


Retrieves employees whose first name starts with J or j.

   <source lang="sql">

SQL> SQL> SQL> SQL> -- create demo table SQL> create table Employee(

 2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
 3    First_Name         VARCHAR2(10 BYTE),
 4    Last_Name          VARCHAR2(10 BYTE),
 5    Start_Date         DATE,
 6    End_Date           DATE,
 7    Salary             Number(8,2),
 8    City               VARCHAR2(10 BYTE),
 9    Description        VARCHAR2(15 BYTE)
10  )
11  /

Table created. SQL> SQL> -- prepare data SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2               values ("01","Jason",    "Martin",  to_date("19960725","YYYYMMDD"), to_date("20060725","YYYYMMDD"), 1234.56, "Toronto",  "Programmer")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("02","Alison",   "Mathews", to_date("19760321","YYYYMMDD"), to_date("19860221","YYYYMMDD"), 6661.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("03","James",    "Smith",   to_date("19781212","YYYYMMDD"), to_date("19900315","YYYYMMDD"), 6544.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("04","Celia",    "Rice",    to_date("19821024","YYYYMMDD"), to_date("19990421","YYYYMMDD"), 2344.78, "Vancouver","Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("05","Robert",   "Black",   to_date("19840115","YYYYMMDD"), to_date("19980808","YYYYMMDD"), 2334.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("06","Linda",    "Green",   to_date("19870730","YYYYMMDD"), to_date("19960104","YYYYMMDD"), 4322.78,"New York",  "Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("07","David",    "Larry",   to_date("19901231","YYYYMMDD"), to_date("19980212","YYYYMMDD"), 7897.78,"New York",  "Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("08","James",    "Cat",     to_date("19960917","YYYYMMDD"), to_date("20020415","YYYYMMDD"), 1232.78,"Vancouver", "Tester")
 3  /

1 row created. SQL> SQL> SQL> SQL> -- display data in the table SQL> select * from Employee

 2  /

ID FIRST_NAME LAST_NAME START_DAT END_DATE SALARY CITY DESCRIPTION


---------- ---------- --------- --------- ---------- ---------- ---------------

01 Jason Martin 25-JUL-96 25-JUL-06 1234.56 Toronto Programmer 02 Alison Mathews 21-MAR-76 21-FEB-86 6661.78 Vancouver Tester 03 James Smith 12-DEC-78 15-MAR-90 6544.78 Vancouver Tester 04 Celia Rice 24-OCT-82 21-APR-99 2344.78 Vancouver Manager 05 Robert Black 15-JAN-84 08-AUG-98 2334.78 Vancouver Tester 06 Linda Green 30-JUL-87 04-JAN-96 4322.78 New York Tester 07 David Larry 31-DEC-90 12-FEB-98 7897.78 New York Manager 08 James Cat 17-SEP-96 15-APR-02 1232.78 Vancouver Tester 8 rows selected. SQL> SQL> SELECT id, first_name, last_name, start_date FROM employee WHERE REGEXP_LIKE(first_name, "^j", "i"); ID FIRST_NAME LAST_NAME START_DAT


---------- ---------- ---------

01 Jason Martin 25-JUL-96 03 James Smith 12-DEC-78 08 James Cat 17-SEP-96 SQL> / ID FIRST_NAME LAST_NAME START_DAT


---------- ---------- ---------

01 Jason Martin 25-JUL-96 03 James Smith 12-DEC-78 08 James Cat 17-SEP-96 SQL> SQL> SQL> SQL> -- clean the table SQL> drop table Employee

 2  /

Table dropped. SQL></source>


Using regexp_like(comments, "([[:alnum:]+[:punct:]]+space:+){8,}")

   <source lang="sql">

SQL> create table history

 2  ( empno      NUMBER(4)
 3  , beginyear  NUMBER(4)
 4  , begindate  DATE
 5  , enddate    DATE
 6  , deptno     NUMBER(2)
 7  , msal       NUMBER(6,2)
 8  , comments   VARCHAR2(60)
 9  ) ;

Table created. SQL> SQL> SQL> SQL> insert into history values (9,2000,date "2000-01-01",date "2002-01-02",40, 950,"history for 9"); 1 row created. SQL> insert into history values (8,2000,date "2000-01-02", NULL ,20, 800,""); 1 row created. SQL> insert into history values (7,1988,date "2000-01-06",date "2002-01-07",30,1000,""); 1 row created. SQL> insert into history values (6,1989,date "2000-01-07",date "2002-01-12",30,1300,""); 1 row created. SQL> insert into history values (5,1993,date "2000-01-12",date "2002-01-10",30,1500,"history for 5"); 1 row created. SQL> insert into history values (4,1995,date "2000-01-10",date "2002-01-11",30,1700,""); 1 row created. SQL> insert into history values (3,1999,date "2000-01-11", NULL ,30,1600,""); 1 row created. SQL> insert into history values (2,1986,date "2000-01-10",date "2002-01-08",20,1000,"history for 2"); 1 row created. SQL> insert into history values (1,1987,date "2000-01-08",date "2002-01-01",30,1000,"history for 1"); 1 row created. SQL> insert into history values (7,1989,date "2000-01-01",date "2002-05-12",30,1150,"history for 7"); 1 row created. SQL> SQL> SQL> SQL> select comments

 2  from   history
 3  where  regexp_like(comments, "([[:alnum:]+[:punct:]]+space:+){8,}");

no rows selected SQL> SQL> drop table history; Table dropped.</source>