(转自:http://blog.csdn.net/xu1314/article/details/10174067)

当我们要进行一些简单的糊涂查询时用百分号(%),通配符(_)就可以了.其中%表达任意长度的字符串,_表示任意的某一个字符.

比如select * from emp where ename like 's%' or ename like 's_';

但如果在一些复杂的查询中关用这两个符号sql语句就会非常复杂,而且也不一定能实现.从Oracle 10g开始引入了在其他程序语言中普通使用的正则表达式.

主要有regexp_like,regexp_replace,regexp_substr,regexp_instr四个正则表达式函数.

正则表达式中的元字符:

元字符 意思 例子
    \

说明要匹配的字符是一个特殊字符、常量或者后者引用。(后引用重复上一次的匹配)

\n 匹配换行符
\\ 匹配 \
\( 匹配 (
\) 匹配 )
^ 匹配字符串的开头位置 ^a匹配arwen.但不匹配barwen.
     $ 匹配字符串的末尾位置 en$匹配arwen.但不匹配arwenb.
      * 匹配前面的字符0次或多次 a*rwen可以匹配rwen或aaarwen.
+ 匹配前面的字符1次或多次 a+rwen可以匹配arwen或aarwen.但不能匹配rwen.
? 匹配前面的字符0次或1次 a?rwen可以匹配arwen或rwen.但不能匹配aarwen.
{n} 匹配前面的字符恰好是n次,其中n是整数 ar{2}wen可以匹配arrwen.但不能匹配arwen或arrrwen.
{n,m}

匹配前面的字符至少是n次,最多是m次.如果写成

{n,}表示最少匹配n次.没有上限.

ar{1,2}wen可以匹配arwen,arrwen.但不匹配awen或arrrwen.
. 点号,匹配除null,换行以外的任意单个字符 arw.n.可以匹配arwen,arwin.但不能匹配arween或arwn.
(pattern) 括号中pattern是一个子正则表达式,匹配指定pattern模式的一个子表达式。 其实括号就像一般语言表达式中的括号.有时多加些括号可增强可读性.另外的用处见下面关于\n的描述.
x|y 匹配“或” x|y可以匹配x或者y
[abc] 可以匹配abc中的任何单个字符 hello[abc]可以匹配helloa,hellob,helloc
[a-z] 可以匹配指定范围内的任何单个字符 hell[a-z]可以匹配hello或者hellz
[::] 指定一个字符类,可以匹配该类中的任何字符 [:alphanum:]可以匹配字符0-9、A-Z、a-z
[:alpha:]可以匹配字符A-Z、a-z
[:blank:]可以匹配空格或tab键
[:digit:]可以匹配数字0-9
[:graph:]可以匹配非空字符
[:lower:]可以匹配小写字母a-z
[:print:]与[:graph:]类似,不同之处在于[:print:]包括空格字符
[:punct:]可以匹配标点符号.,""等等
[:space:]可以匹配所有的空字符
[:upper:]可以匹配大写字母A-Z
[:xdigit:]可以匹配十六进制数字0-9、A-F、a-f
\n 这是对前一次匹配命中的一个后引用,其中n是一个正整数 arw(en)\1可以匹配arwenen.注意\1前面必须是个加括号的子表达式.

1.regexp_like:

regexp_like(x,pattern[,match_option]),查看x是否与pattern相匹配,该函数还可以提供一个可选的参数match_option字符串说明默认的匹配选项。match_option的取值如下:
‘c’   说明在进行匹配时区分大小写(缺省值);
 'i'   说明在进行匹配时不区分大小写;
 'n'   (.)点号能表示所有单个字符,包括换行(俺还不知道什么地方有用到换行.只知道sql里面可以用chr(10)表示换行.
 'm'   字符串存在换行的时候当作多行处理.这样$就可匹配每行的结尾.不然的话$只匹配字符串最后的位置.

示例:select * from emp where regexp_like(ename,'^a[a-z]*n$');可以查找ename中以a开头以n结尾的行.例如ename为arwen或arwin或anden.但Arwen不能被匹配.因为默认是区分大小写.如果是select * from emp where regexp_like(ename,'^a[a-z]*n$','i')则可以查找ename为Arwen的行记录.

2.regexp_instr:

REGEXP_INSTR(x,pattern[,start[,occurrence[,return_option[, match_option]]]])用于在x中查找pattern。返回pattern在x中出现的位置。匹配位置从1开始。可以参考字符串函数 INSTR(),参数相关:
    'start'   开始查找的位置;
    'occurrence'   说明应该返回第几次出现pattern的位置;
    'return_option'   说明应该返回什么整数。若该参数为0,则说明要返回的整数是x中的一个字符的位置;若该参数为非0的整数,则说明要返回的整数为x中出现在pattern之后   的字符的位置;
    'match_option'   修改默认的匹配设置.与regexp_like里面的相同.

示例:

DECLARE

V_RESULT INTEGER ;

BEGIN

SELECT  REGEXP_INSTR('hello world','o',1,1,0) INTO  V_RESULT

FROM  DUAL;

DBMS_OUTPUT.PUT_LINE(V_RESULT);

END;

结果为5.即字母o第一个次出现的位置

如果regexp_instr('hello world','o',1,1,n)其中n为除0之外的整数.比如1,3.则结果为6.表示第一次出现字母o的后面一个字符的位置.

如果regexp_instr('hello world','o',1,2,0)则结果为9.表示第二次出现字母o的位置.

3.regexp_replace:

REGEXP_REPLACE(x,pattern[,replace_string[,start[,occurrence[, match_option]]]])用于在x中查找pattern,并将其替换为replae_string。可以参考字符串函数 REPLACE(),参数同REGEXP_INSTR函数

示例:

DECLARE

V_RESULT varchar2(90);

BEGIN

SELECT  REGEXP_REPLACE('hello world','o','x',1,1) INTO  V_RESULT

FROM  DUAL;

DBMS_OUTPUT.PUT_LINE(V_RESULT);

END;

结果为hellx world.

如果REGEXP_REPLACE('hello world','o','x'),则结果为hellx wxrld.

如果 REGEXP_REPLACE('hello world','o','x',1,2)则结果为hello wxrld.

4.regexp_substr:

REGEXP_SUBSTR(x,pattern[,start[,occurrence[, match_option]]])用于在x中查找pattern并返回。可以参考字符串函数 SUBSTR(),参数同REGEXP_INSTR函数.

例如:

DECLARE

V_RESULT VARCHAR2(255);

BEGIN

SELECT  REGEXP_SUBSTR('hello world','l{2}') INTO  V_RESULT

FROM  DUAL;

DBMS_OUTPUT.PUT_LINE(V_RESULT);

END ;

结果为ll

查询到匹配的字符串才返回匹配的字符.没查到就返回空.

SQL正则表达式的更多相关文章

  1. SQL 正则表达式使模式匹配和数据提取变得更容易

    SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易 David Banister 本文讨论: 使用正则表达式进行高效的 SQL 查询 SQL Server 2005 对正则表达式 ...

  2. git/SQL/正则表达式的在线练习网站

    虽说我没事就喜欢喷应试教育,但我也从应试教育中发现了一个窍门:如果能够以刷题的形式学习某项技能,效率和效果是最佳的.对于技术的学习,我经常面临的困境是,理论知识知道的不少,但是有的场景实在无法模拟,缺 ...

  3. SQL 正则表达式 `(user_log_acct)?+.+`

    SELECT 语句可以使用正则表达式做列选择,下面的语句查询除了 ds 和 hr 之外的所有列: SELECT `(ds|hr)?+.+` FROM test    

  4. SQL Server中执行正则表达式

    总体方案:写function,再执行update语句. 一.查询函数 -- ============================================= -- Author: <l ...

  5. 正则表达式与SQL

    在我心中正则表达式和SQL就是一样的东西. SQL是结构化查询语言,是根据某个查询.修改规则来查询修改数据,是描述一个规则给数据库,数据库来执行, 数据库返回结果,过程不需要考虑,不算是编程语言. 正 ...

  6. 应用C#和SQLCLR编写SQL Server用户定义函数

    摘要: 文档阐述使用C#和SQLCLR为SQL Server编写用户定义函数,并演示用户定义函数在T-SQL中的应用.文档中实现的 Base64 编码解码函数和正则表达式函数属于标量值函数,字符串分割 ...

  7. Sql Server 2005 CLR实例

    本文转载:http://www.cnblogs.com/yongfa365/archive/2010/04/26/SQL-Server-CLR.html CSDN:博客参考http://blog.cs ...

  8. Postgresql 正则表达式

    在postgresql中使用正则表达式时需要使用关键字“~”,以表示该关键字之前的内容需匹配之后的正则表达式,若匹配规则不需要区分大小写,可以使用组合关键字“~*”: 相反,若需要查询不匹配这则表达式 ...

  9. mysql sql知识总结

    SQL知识总结: 检索不同的行: SELECT DISTINCT VEND_ID FROM PRODUCTS; DISTINCT 应用于所有的列 =================== 限制结果: S ...

随机推荐

  1. unity3d相关资源

    http://pan.baidu.com/s/1kTG9DVD   GUI源码

  2. Angular学习笔记—创建一个angular项目

    开始项目前,你需要先安装node和npm,然后执行npm install -g @angular/cli安装Angular CLI. 如何安装node.js和npm npm使用介绍 1.安装angul ...

  3. shell sed 命令

    1:行首空格  sed 's/^[ \t]*//g'  2:行末空格 sed 's/[ \t]*$//g' 3,删除行首的空格或TAB,并删除<tr>.cat poem2id.txt | ...

  4. 使用GoogleCode作SVN服务器的一些问题及解决办法

    1.首先最主要的一个问题,就是注册GoogleCode和安装SVN工具. 网上教程很多,不一一赘述.http://www.th7.cn/Program/net/201305/136059.shtml ...

  5. 网络:W5500用浏览器配置设备

    1.背景 嵌入式端使用网络通信后,可以在PC端进行设备配置.方法有二:1)上位机配置:2)浏览器配置. 上位机配置可以把设置和测量作为一体,功能可以很强大,体验较好. 浏览器配置就是在电路板上搭载一个 ...

  6. 面试:做过sql优化吗?

    近来面试找工作经常会遇见这种问题: 做过数据库优化吗?大数据量基础过吗?系统反应慢怎么查询? 这咱也没背过啊,面试还老问,现在的网站主要的压力都来自于数据库,频繁的数据库访问经常会使系统瘫痪,这样就需 ...

  7. Android Studio 入门级教程

    引用原文:http://www.cnblogs.com/abao0/p/6934023.html 写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,文章可以转载,无需版权.希望尽自己的努力 ...

  8. Linux图形化界面下使用命令进行截图的方法

    以前在LINUX里面截图都是直接按print screen键或者 alt + print screen. 但是print screen是整个屏幕, alt + print screen是当前窗口. 想 ...

  9. sql server 数据库复制实现数据同步常见问题(不定期更新)

    sql server2008数据库复制实现数据同步常见问题 在原作者基础上追加 sql server2008数据库复制实现数据同步常见问题 23.发布 'xx' 的并发快照不可用,因为该快照尚未完全生 ...

  10. Spring Cloud 微服务开放平台接口

    github源码地址:https://github.com/spring-cloud/spring-cloud-security 前言: 什么是开放平台接口 场景 : 总公司与子公司 对接接口  还有 ...