-- Start
大家对 LIKE 语句应该都很熟悉,它是用来做模糊查询的。Oracle 还提供了 REGEXP_LIKE,让我们可以通过正则表达式来做模糊查询,下面是一个简单的例子。
CREATE TABLE EMPLOYEE
(
ID NUMBER(10),
NAME VARCHAR2(20),
EMAIL VARCHAR2(60)
);
INSERT INTO EMPLOYEE VALUES (1, 'zhang san', 'san.zhang@163.com;san.zhang@qq.com');
INSERT INTO EMPLOYEE VALUES (2, 'wang mazi', 'mazi.wang@163.com');
假设让你查找一下姓 zhang 的员工,注意 zhang 不区分大小写,怎么办?我们可以使用 LIKE, 也可以使用 REGEXP_LIKE。
SELECT * FROM EMPLOYEE WHERE UPPER(NAME) LIKE 'ZHANG%';
SELECT * FROM EMPLOYEE WHERE REGEXP_LIKE(NAME, '^zhang.*$', 'i');
如果你还不熟悉正则表达式,请参考本人另一系列文章“ 正则表达式精萃”。上面的 i 指的是匹配模式,Oracle 支持如下的匹配模式。可以指定多个匹配模式的哦。
i 表示不区分大小写
c 表示区分大小写
n 单行模式,也叫点号通配模式
m 多行模式,又称增强的行锚点模式
x 注释模式
除此之外,Oracle 还提供了以下几个支持正则表达式的函数,用来对字符串进行操作。
REGEXP_SUBSTR 通过正则表达式查找子字符串
REGEXP_INSTR 通过正则表达式查找子字符串的位置
REGEXP_COUNT 通过正则表达式查找子字符串的数量
REGEXP_REPLACE 通过正则表达式替换
下面是一个简单的例子。
-- 查找第一个 EMAIL 地址
SELECT NAME, REGEXP_SUBSTR(EMAIL,'^[^;]+;?') FROM EMPLOYEE;
-- 查找第一个 EMAIL 地址
SELECT NAME, REGEXP_REPLACE(EMAIL,';.*$') FROM EMPLOYEE;
-- 查找 ; 的位置
SELECT NAME, REGEXP_INSTR(EMAIL,';') FROM EMPLOYEE;
-- 查找 @ 的数量
SELECT NAME, REGEXP_COUNT(EMAIL,'@') FROM EMPLOYEE;
--更多参见:Oracle SQL 精萃
-- 声明:转载请注明出处
-- Last edited on 2015-02-26
-- Created by ShangBo on 2015-02-25
-- End