Oracle中REGEXP_LIKE与LIKE的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle中REGEXP_LIKE与LIKE的区别相关的知识,希望对你有一定的参考价值。

LIKE  是 标准的 SQL 处理。 SQL Server, DB2 , mysql 等大部分数据库, 都支持的写法。


REGEXP_LIKE 是 Oracle 特有的, 正则表达式的 LIKE 的处理。

下面是一些  REGEXP_LIKE  使用的例子

测试表

CREATE TABLE test_reg_like ( a varchar(20) );

INSERT INTO test_reg_like VALUES('ABC');
INSERT INTO test_reg_like VALUES('A12');
INSERT INTO test_reg_like VALUES('12a12');


3个参数
第一个是输入的字符串
第二个是正则表达式
第三个是取值范围:
i:大小写不敏感;
c:大小写敏感;
n:点号 . 不匹配换行符号;
m:多行模式;
x:扩展模式,忽略正则表达式中的空白字符。




全部测试数据
SQL> SELECT * FROM test_reg_like;
A
----------------------------------------
ABC
A12
12a12

匹配字母A的
SQL> SELECT
  2    *
  3  FROM
  4    test_reg_like
  5  WHERE
  6    REGEXP_LIKE(a, 'A');
A
----------------------------------------
ABC
A12

匹配字母A的 (大小写不敏感)
SQL> SELECT
  2    *
  3  FROM
  4    test_reg_like
  5  WHERE
  6    REGEXP_LIKE(a, 'A', 'i');
A
----------------------------------------
ABC
A12
12a12

匹配字母A 后面跟1个或多个数字的 (大小写不敏感)
SQL> SELECT
  2    *
  3  FROM
  4    test_reg_like
  5  WHERE
  6    REGEXP_LIKE(a, 'A\\d+', 'i');
A
----------------------------------------
A12
12a12

匹配字母A开头,数字结尾的
SQL> SELECT
  2    *
  3  FROM
  4    test_reg_like
  5  WHERE
  6    REGEXP_LIKE(a, '^A.+\\d$');
A
----------------------------------------
A12




CREATE TABLE test_phone (
phone_number  varchar(20)
);

INSERT INTO test_phone
SELECT '13812345678' FROM  dual  UNION ALL
SELECT '13812345566' FROM  dual  UNION ALL
SELECT '13812345656' FROM  dual  UNION ALL
SELECT '13812345556' FROM  dual  UNION ALL
SELECT '13812346666' FROM  dual  UNION ALL
SELECT '13855661234' FROM  dual  UNION ALL
SELECT '13856561234' FROM  dual  UNION ALL
SELECT '13855561234' FROM  dual  UNION ALL
SELECT '13866661234' FROM  dual;


--  AAAA 结尾的
SELECT
  *
FROM
  test_phone
WHERE
  REGEXP_LIKE(REVERSE(phone_number), '^(\\d)\\1\\1\\1');

PHONE_NUMBER
----------------------------------------
13812346666



--  AABB 结尾的
SELECT
  *
FROM
  test_phone
WHERE
  REGEXP_LIKE(REVERSE(phone_number), '^(\\d)\\1([^\\1])\\2')
  AND NOT REGEXP_LIKE(REVERSE(phone_number), '^(\\d)\\1\\1\\1');

PHONE_NUMBER
----------------------------------------
13812345656



--  ABAB 结尾的
SELECT
  *
FROM
  test_phone
WHERE
  REGEXP_LIKE(REVERSE(phone_number), '^(\\d)(\\d)\\1\\2')
  AND NOT REGEXP_LIKE(REVERSE(phone_number), '^(\\d)\\1\\1\\1');

PHONE_NUMBER
----------------------------------------
13812345656

参考技术A

    Oracle中的Like操作符使用'_'和'%'作为通配符,使用就像这样:

    SELECT name FROM test_like WHERE name like '_a%'; 

    即匹配test_like表name列中第2个字母是a的所有行。但是注意,Oracle匹配时区分大小写的。也就是说上面的查询时无法查询到name='SAas'这行的。

    Oracle10g中提供的正则表达式功能可以很好的解决这个问题,当然这不是使用正则表达式函数的唯一优点,实际上它比Like操作符强大的多。

    正则表达式的语法就不用多说了,现在大多数语言都支持正则表达式了。

    下面主要介绍下Oracle中正表达式函数REGEXP_LIKE的使用:

    REGEXP_LIKE(x, pattern [, match_option])     

    当源字符串x匹配正则表达式pattern时,返回true。可以使用match_option修改默认匹配选项,该参数可以被设置为:   

    - 'c', 说明在进行匹配时区分大小写(默认选项)   

    - 'i', 说明在进行匹配时不区分大小写   

    - 'n'   允许使用可以匹配任意字符的操作符(通常是'.')   

    - 'm', 将x作为一个包含多行的字符串  

    举个例子:

    SELECT * FROM test_reg WHERE REGEXP_LIKE(name, '(a)\\1', 'i');  

    上面的SQL语句匹配test_reg表中name列含有两个连续字符'a'(不区分大小写)的行,如name='SaAs'。此外,这里我们还使用了正则表达式中的后引用语法——\\n表示重复n次上次匹配的内容,此处(a)\\1表示匹配两个连续的字符'a'。

    需要注意的是,后引用必须使用双括号,否则会出现如下结果:

    SELECT * FROM test_reg WHERE REGEXP_LIKE(name, 'a\\1', 'i')   

    ORA-12727: 正则表达式中的后向引用无效  

    最后一点,不要混淆LIKE操作符的通配符和正则表达式的语法,也就是说不要再正则表达式中使用LIKE操作符中的通配符,如果这样做会得到未知的结果,因为'_'和'%'会被正则表达式当做普通字符进行匹配。

    比如下面这条SQL想要得到name='SaAs'这条记录,但实际的查询结果为空。

    SQL> SELECT * FROM test_reg WHERE REGEXP_LIKE(name, '^_(a)\\1', 'i');   

    NAME  

    ----------  实际应该使用:

    SQL> SELECT * FROM test_reg WHERE REGEXP_LIKE(name, '^.(a)\\1', 'i');       

    NAME  

    ----------   SaAs  

参考技术B REGEXP_LIKE这个是正则表达式函数,需要正则表达式来匹配结果。如,我要找一个表的列以 0 开始以 80 结束的长度为6位的数据,
SELECT * FROM staff a WHERE a.staff_code LIKE '0___80';
SELECT * FROM staff a WHERE REGEXP_LIKE(a.staff_code,'0[0-9]380');

看看这个链接
http://hi.baidu.com/xiaoheilong/item/34bd5d8f06515ad45f0ec16d本回答被提问者和网友采纳
参考技术C REGEXP_LIKE是正则表达式查询 比用增强版的like

oracle正则表达式regexp_like的用法详解

ORACLE中的支持正则表达式的函数主要有下面四个:
1,REGEXP_LIKE :与LIKE的功能相似
2,REGEXP_INSTR :与INSTR的功能相似
3,REGEXP_SUBSTR :与SUBSTR的功能相似
4,REGEXP_REPLACE :与REPLACE的功能相似
它们在用法上与Oracle SQL 函数LIKE、INSTR、SUBSTR 和REPLACE 用法相同,
但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符。
POSIX 正则表达式由标准的元字符(metacharacters)所构成:
‘^‘ 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
‘$‘ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹
配 ‘/n‘ 或 ‘/r‘。
‘.‘ 匹配除换行符之外的任何单字符。
‘?‘ 匹配前面的子表达式零次或一次。
‘+‘ 匹配前面的子表达式一次或多次。
‘*‘ 匹配前面的子表达式零次或多次。
‘|‘ 指明两项之间的一个选择。例子‘^([a-z]+|[0-9]+)$‘表示所有小写字母或数字组合成的
字符串。
‘( )‘ 标记一个子表达式的开始和结束位置。
‘[]‘ 标记一个中括号表达式。
‘{m,n}‘ 一个精确地出现次数范围,m=<出现次数<=n,‘{m}‘表示出现m次,‘{m,}‘表示至少
出现m次。
/num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。
字符簇: 
[[:alpha:]] 任何字母。
[[:digit:]] 任何数字。
[[:alnum:]] 任何字母和数字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大写字母。
[[:lower:]] 任何小写字母。
[[:punct:]] 任何标点符号。
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]。
各种操作符的运算优先级
/转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, anymetacharacter 位置和顺序


--创建表
create table fzq
(
  id varchar(4),
  value varchar(10)
);
--数据插入
insert into fzq values
(‘1‘,‘1234560‘);
insert into fzq values
(‘2‘,‘1234560‘);
insert into fzq values
(‘3‘,‘1b3b560‘);
insert into fzq values
(‘4‘,‘abc‘);
insert into fzq values
(‘5‘,‘abcde‘);
insert into fzq values
(‘6‘,‘ADREasx‘);
insert into fzq values
(‘7‘,‘123  45‘);
insert into fzq values
(‘8‘,‘adc  de‘);
insert into fzq values
(‘9‘,‘adc,.de‘);
insert into fzq values
(‘10‘,‘1B‘);
insert into fzq values
(‘10‘,‘abcbvbnb‘);
insert into fzq values
(‘11‘,‘11114560‘);
insert into fzq values
(‘11‘,‘11124560‘);
--regexp_like
--查询value中以1开头60结束的记录并且长度是7位
select * from fzq where value like ‘1____60‘;
select * from fzq where regexp_like(value,‘1....60‘);
--查询value中以1开头60结束的记录并且长度是7位并且全部是数字的记录。
--使用like就不是很好实现了。
select * from fzq where regexp_like(value,‘1[0-9]{4}60‘);
-- 也可以这样实现,使用字符集。
select * from fzq where regexp_like(value,‘1[[:digit:]]{4}60‘);
-- 查询value中不是纯数字的记录
select * from fzq where not regexp_like(value,‘^[[:digit:]]+$‘);
-- 查询value中不包含任何数字的记录。
select * from fzq where regexp_like(value,‘^[^[:digit:]]+$‘);
--查询以12或者1b开头的记录.不区分大小写。
select * from fzq where regexp_like(value,‘^1[2b]‘,‘i‘);
--查询以12或者1b开头的记录.区分大小写。
select * from fzq where regexp_like(value,‘^1[2B]‘);
-- 查询数据中包含空白的记录。
select * from fzq where regexp_like(value,‘[[:space:]]‘);
--查询所有包含小写字母或者数字的记录。
select * from fzq where regexp_like(value,‘^([a-z]+|[0-9]+)$‘);
--查询任何包含标点符号的记录。
select * from fzq where regexp_like(value,‘[[:punct:]]‘);

理解它的语法就可以了。其它的函数用法类似。
































































































以上是关于Oracle中REGEXP_LIKE与LIKE的区别的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中REGEXP_LIKE与LIKE的区别?

oracle regexp_like介绍和例子

oracle正则表达式regexp_like的用法详解

oracle 判断字段是否为是数字等 regexp_like用法 正则表达式

正则 及 oracle 判断字段是否为是数字 regexp_like用法 正则表达式

Oracle:Oracle 8i 中 REGEXP_LIKE 函数的替代方案