Oracle数据库正则表达式使用场景代码实例_oracle

来源:脚本之家  责任编辑:小易  

这是存储过程?追问sql语句,DECODE(control_value,value1,result1[,value2,result2…][,default_result]);参数说明:control _value试图处理的数2113值。可以是数据库中5261表的某一列,DECODE函数将该数值与后面的4102一系列的1653偶序相比较,以决定返回值。value1是一组成序偶的数值。如果输入数值与之匹配成功,则相应的结果将被返回。对应一个空的返回值,可以使用关键字NULL于之对应result1是一组成序偶的结果值。default_result 未能与任何一个值匹配时,函数返回的默认值。追问请看清楚需求!!本回答被网友采纳www.zgxue.com防采集请勿采集本网。

正则表达式:

oracle的正则表达式(10g才可以用) oracle的正则表达式(regular expression)简单介绍 目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境。 Oracle 10g正则表达式提高了SQL灵活

无论是在前端还是后台正则表达式都是一个至关重要的知识点,例如判断一个手机号码输入是否正确,如果使用Java、C或者其他语言进行字符串进行判断,也许写几十行代码都不一定能解决,而且漏洞百出,而使用正则表达式,一行代码则可轻易解决,下面是举例说明正则表达式的用法:

a[[:space:]]{3}b 看a b后面似乎还有空格,但是没看出来具体几个。 [[:space:]]-- 注释-- 如上表示任意空白,你可以在b后面再添加

1: \d 代表一个(阿拉伯数字) 任意数字

15:45:11 SQL> select substr('2:1:3',instr('2:1:3',':',2)+1, 15:45:14 2 instr('2:1:3',':',3)-instr('2:1:3',':',2)-1) from dual; S - 1 已用时间: 00: 00: 00.15 15:45:19 SQL> select substr('2:1:3',1,instr('2:1:3',':')-1) from dual;

例如:判断用户输入的是否为11位数字(当然手机号码是不能这么简答的表达,只是解释一下\d的用法)

--oracle 貌似不支持正向否定预查,还是用刚刚思路:--目标值2:WITH TMP AS (SELECT 'ZB0010+-=-3KFJK(ZB0012S)DLKG-=-ZB0042ZB0323' AS STR FROM DUAL)SELECT LEVEL AS ID, REGEXP_SUBSTR(STR, 'ZB[0-9]{4}', 1, LEVEL) AS VALUEFROM TM

 select 'ok'

Oracle使用正则表达式离不开这4个函数:1、regexp_like2、regexp_substr3、regexp_instr4、regexp_replaceregexp_like 只能用于条件表达式,和like类似,但是使用的正则表达式进行匹配,语法如下:regexp_substr 函数,和substr类似,用于拾取合

 from dual

 where regexp_like('18812345678','\d\d\d\d\d\d\d\d\d\d\d')

2: . 代表一个(任意字母) 任意字母

  这里需要注意的是,如果输入的数字确实需要字母 . 的话,不能直接输 . 要转换一下格式,输入 \. 即可,这个需要注意。

3: [[:number:]] 一个任意数字(可以使十六进制)

这个用的并不多,如果现实十六进制,可以使用如下方式即可

 select 'ok'

Oracle使用正则表达式离不开这4个函数:1、regexp_like2、regexp_substr3、regexp_instr4、regexp_replaceregexp_like 只能用于条件表达式,和like类似,但是使用的正则表达式进行匹配,语法如下:regexp_substr 函数,和substr类似,用于拾取合

 from dual

 where regexp_like('str','[0-9a-fA-F]')

4: [[:alpha:]] 一个任意大小写字母

5: [ ] 匹配到方括号内的其中一个字母

方括号中只能匹配到其中的任意一个字母,或者是7 或者是8或者是9,只能是1个

 select 'ok'

Oracle使用正则表达式离不开这4个函数:1、regexp_like2、regexp_substr3、regexp_instr4、regexp_replaceregexp_like 只能用于条件表达式,和like类似,但是使用的正则表达式进行匹配,语法如下:regexp_substr 函数,和substr类似,用于拾取合

 from dual

 where regexp_like('8','[379]')

例如下面的就是ASCII码中,数字3到ASCII码 小写的 a 其中的任意一个字符的匹配

select 'ok'

from dual

where regexp_like('9','[3-a]')  

当然如果是12345678这样的连续的数字可以这么写

 select 'ok'

Oracle使用正则表达式离不开这4个函数:1、regexp_like2、regexp_substr3、regexp_instr4、regexp_replaceregexp_like 只能用于条件表达式,和like类似,但是使用的正则表达式进行匹配,语法如下:regexp_substr 函数,和substr类似,用于拾取合

 from dual

 where regexp_like('str','[1-8]')

如果是要匹配 12345678 中的其中一个,或者是字母 a也行,就可以这么写,a可以写到前边,也可以写到后面,这并无所谓,因为只匹配一个而已

 select 'ok'

Oracle使用正则表达式离不开这4个函数:1、regexp_like2、regexp_substr3、regexp_instr4、regexp_replaceregexp_like 只能用于条件表达式,和like类似,但是使用的正则表达式进行匹配,语法如下:regexp_substr 函数,和substr类似,用于拾取合

 from dual

 where regexp_like('str','[a1-8]')

6: () 单词匹配

单词匹配,一般用竖线隔开,例如:小明喜欢吃苹果或者香蕉或者樱桃,此时就应该是用单词的匹配,在圆括号中任选一个。

 select 'ok'

Oracle使用正则表达式离不开这4个函数:1、regexp_like2、regexp_substr3、regexp_instr4、regexp_replaceregexp_like 只能用于条件表达式,和like类似,但是使用的正则表达式进行匹配,语法如下:regexp_substr 函数,和substr类似,用于拾取合

 from dual

 where regexp_like('小明喜欢吃苹果.','小明喜欢吃(苹果|香蕉|樱桃)\.')

7:量词:来修饰左侧的元素的数量,三个量词

  7.1: * 0到任意多个

  7.2: + 1到任意多个

  7.3: ? 0或者1个

{N},代表左侧有N个数据,比如上面的手机号码验证,\d 需要输入9个,这里就可以使用{N}来简化一下,\d是数字,然后\d{10},代表这里有10个数字

 select 'ok'

Oracle使用正则表达式离不开这4个函数:1、regexp_like2、regexp_substr3、regexp_instr4、regexp_replaceregexp_like 只能用于条件表达式,和like类似,但是使用的正则表达式进行匹配,语法如下:regexp_substr 函数,和substr类似,用于拾取合

 from dual

 where regexp_like('str','1\d{10}')

如果是:{2,10} 代表左侧的东西 最少有2个,最多有10个

9:引导符: ^ :在正则表达式最前方使用 ^ ,代表只能按照表达式的格式去匹配

10:结束符: $ :在正则表达式最后面使用 ¥ ,代表只能按照表达式的格式去匹配

出现前导符的原因:因为正则表达式只匹配"表达式匹配条件的内容",之外的不匹配

11:\n 换行

  Oracle使用正则5261表达式离不开这4个函数: 4102 1、regexp_like  2、regexp_substr  3、regexp_instr  4、regexp_replace  regexp_like 只能用于条件表达式,和 like 类似1653,但是使用的正则表达式进行匹配,语法如下:  regexp_substr 函数,和 substr 类似,用于拾取合符正则表达式描述的字符子串,语法如下:  regexp_instr 函数,和 instr 类似,用于标定符合正则表达式的字符子串的开始位置,语法如下:  regexp_replace 函数,和 replace 类似,用于替换符合正则表达式的字符串,语法如下:  解析一下几个参数的含义:  1、source_char,输入的字符串,可以是列名或者字符串常量、变量。  2、pattern,正则表达式。  3、match_parameter,匹配选项。  取值范围: i:大小写不敏感; c:大小写敏感;n:点号 . 不匹配换行符号;m:多行模式;x:扩展模式,忽略正则表达式中的空白字符。  4、position,标识从第几个字符开始正则表达式匹配。  5、occurrence,标识第几个匹配组。  6、replace_string,替换的字符串,Oracle正则表达式的应用在2113oracle里正则表达式有四个函5261数可用,分别是regexp_like、4102regexp_substr、regexp_instr 和regexp_replace。这里在我们oracle 10g里灵活应用。 先来简单介绍一下1653正则表达式的内容,正则表达式是做为快速查询的文本内容的,在linux应用比较多,首先,行的起始与结束 “^”这个字符是表示只查找行首的内容。“$”这个字符只查找行末的内容。接下来是“^”还可以做为一个排除字符来使用。还是使用例子来做一个演示比较明了一下。 这里我使用regexp_like这个函数来做,这样可以我们平时会使用的比较多。select * from test_tablewhere regexp_like(field_1,'^1234')这个就是表示是以1234打头的字符串是不是有匹配的。这里和like的方式是一样的。 select * from test_tablewhere regexp_like(field_1,'^[12]234')这里多了一个[]这里做一个独立字符,这里表示是以1或2开始,并且接着是234这个里的字符就会是匹配的。 select * from test_tablewhere regexp_like(field_1,'^(欧阳|李)小二')这里我们就可以表达,这个查询一个姓是欧阳或李的,名字叫小二的字符串。这里多了一个()这个是做一个为字符串的方式来写的与[]刚好是对应。这里还有一个“|”来表示或的意思。 select * from test_tablewhere regexp_like(field_1,'^李[小]*二')这里我们就可以查询李小二或是李二,再或者是李小小二,都可以,这里我们需要讲一下是[]后面带了一个*,这个是表示0~无穷大 字符去匹配。这个[]我们还可以添加一个“+”来表示1~无穷大的字符去匹配,也可以更加精准一些,在[]后面{1,3}这里就是表示1个到3个相同字符的匹配。还有一个“?”来说表示1或是0个。 select * from test_tablewhere regexp_like(field_1,'李[^小]二')这里我们可以查询到姓李的,但是第二字不是“小”这个字。 select * from test_tablewhere regexp_like(field_1,'[0-9]')这里是表示我们查询字符串含有0-9的数字的字符串。 select * from test_tablewhere regexp_like(field_1,'[a-z]')这里是表示我们查询字符串含有a-z的小写字母的字符串。 select * from test_tablewhere regexp_like(field_1,'[A-z]')这里是表示我们查询字符串含有A-z的所有字母的字符串。 select * from test_tablewhere regexp_like(name,'[[:alpha:]]')这里是表示查询匹配任意字母,也包括中文字 select * from test_tablewhere regexp_like(name,'[[:alnum:]]')这里是表示查询匹配任意字母和数字 select * from test_tablewhere regexp_like(name,'[[:digit:]]')这里是表示查询匹配任意数字 Select * from test_tableWhere regexp_like(name,’of’,’i’)这里就是of不区分大小写 Select * from test_tableWhere regexp_like(name,’^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$’)这样我们可以查询是不是ip格式 接下来介绍一下regexp_substr这个也是一个非常实用的一个函数 REGEXP_SUBSTR与SUBSTR函数相同,返回截取的子字符串 REGEXP_SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]]) 注: srcstr 源字符串 pattern 正则表达式样式 position 开始匹配字符位置 occurrence 匹配出现次数 match_option 匹配选项(区分大小写) SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+') FROM dual; Output: 1PSN [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符 SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+', 1, 2) FROM dual; Output: 231 与上面一个例子相比,多了两个参数1 表示从源字符串的第一个字符开始查找匹配2 表示第2次匹配到的字符串(默认值是“1”,如上例) select regexp_substr('@@/231_3253/ABc','@*[[:alnum:]]+') from dual; Output: 231 @* 表示匹配0个或者多个@ [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符注意:需要区别“+”和“*”的区别 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]*') from dual; Output: @@+ 表示匹配1个或者多个@ [[:alnum:]]* 表示匹配0个或者多个字母或数字字符 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from dual; Output: Null @+ 表示匹配1个或者多个@ [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符 select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from dual; Output: 125 [[:digit:]]+$ 表示匹配1个或者多个数字结尾的字符 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from dual; Output: Null @+ 表示匹配1个或者多个@ [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符 select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from dual; Output: 125 [[:digit:]]+$ 表示匹配1个或者多个数字结尾的字符 select regexp_substr('@1PSN/231_3253/ABc','[^[:digit:]]+$') from dual; Output: /ABc [^[:digit:]]+$ 表示匹配1个或者多个不是数字结尾的字符 select regexp_substr('Tom_Kyte@oracle.com','[^@]+') from dual; Output: Tom_Kyte [^@]+ 表示匹配1个或者多个不是“@”的字符 select regexp_substr('1PSN/231_3253/ABc','[[:alnum:]]*',1,2) from dual; Output: Null [[:alnum:]]* 表示匹配0个或者多个字母或者数字字符注:因为是匹配0个或者多个,所以这里第2次匹配的是“/”(匹配了0次),而不是“231”,所以结果是“Null” 这里我们有时候会查询字符串里asdfafd<main>dafda 这里我们要取出<main>这个字符串Select regexp_substr('asdfafd<main>dafda','<[^>]+>') from dualOutput: <main> 这里我们在<>中间去一个^>这样在匹配<之后,在向后查询的时候确保在匹配到>之前不再在有>,不然的话就要有可以出错的情况。 Select regexp_substr('asdfafd<main>da>fda','<[^<]+>') from dualOutput: <main>da>在这个例子中,我们在<main>之后还在da>,这样的话,如果我们没有添加^>,正则表达式就会向后继续去匹配,直到最后一个>为至,这样就会出现偏差 这个通常用来实现字符串的列传行select regexp_substr('123;234;345;456;567;678;789','[^;]+',1,rownum) from dualconnect by rownum <= length('123;234;345;456;567;678;789') - length(replace('123;234;345;456;567;678;789',';'))+1这里length这里操作是先得到有多少个“;”,再通过 connect by rownum方式来做一行成多行的操作,在变成多行之后,可以通过regexp_substr来取字符串的操作 接着上一个例子a,b,c,d,e,d,f,a,n这样的一个字符串,我们现在要把字符串里一些重复去掉,这样的话结果是a,b,c,d,e,f,n去掉了d与a的两个字符串select wm_concat(new_row) from (select distinct regexp_substr('a,b,c,d,e,d,f,a,n','[^,]+',1,rownum) new_row from dualconnect by rownum<=length('a,b,c,d,e,d,f,a,n')-length(replace('a,b,c,d,e,d,f,a,n',',')))通过转成多行的,再用distinct 去掉重复,然后我们再通过wm_concat来字符串合并来完成。 再来一个ip格式转换的例子吧,我们一般的IP的格式是12.19.168.27现在要不足3位的补足前面为0,结果是012.019.168.027select wm_concat(new_value) from (select lpad(regexp_substr('12.19.168.27','[^.]+',1,rownum) ,3,'0') new_value,rownumfrom dualconnect by rownum<5order by rownum) 来一个验证IP是数字是否正确select count(*) from(select lpad(regexp_substr('12.19.168.27','[^.]+',1,rownum) ,3,'0') new_value,rownumfrom dualconnect by rownum<5)where new_value>=0 and new_value<256having count(*) =4 来一个IP字符串格式转换成数字型IPselect sum(new_value*power(256,4-rm)) from (select regexp_substr('12.19.168.27','[^.]+',1,rownum) new_value,rownum rm from dualconnect by rownum<=4) 接下来介绍一个regexp_instr函数 REGEXP_INSTR 函数使用正则表达式返回搜索模式的起点和终点。REGEXP_INSTR 的语法如下所示。REGEXP_INSTR 返回一个整数,指出搜索模式的开始或结束的位置,如果没有发现匹配的值,则返回0。 语法: 2.REGEXP_INSTR与INSTR函数相同,返回字符串位置 REGEXP_INSTR(srcstr, pattern [, position [, occurrence [, return_option [,match_option]]]]) 与REGEXP_SUBSTR一样,它也有变量pattern、position(开始位置)、occurrence 和match_parameter;这里主要介绍一下新参数return_option 的作用,它允许用户告诉Oracle,模式出现的时候,要返回什么内容。 Select regexp_instr('asdfafd<main>da>fda','sd') from dualOutput:2这里去查询sd的位置,这个和instr是在相同的 Select regexp_instr('asdfafd<main>da>fda','da',1,2) from dual这里是查询da第二出现的位置 还有我们经常会遇到一种情况是,查询某个字段,如果是等于“上海”或“北京”或者我们温州就写成大城市,其它的写成小城市,我们一般会考虑使用decode这种方式 Select decode('上海','上海','大城市','北京' ,'大城市' ,'温州' ,'大城市','小城市') from dual只有两个我们可能觉的sql也不是很冗长,如果有四五个的话,就有点长了,这里使用regexp_instr就可以很多的去操作 Select decode (regexp_instr('北京','^(上海|北京|温州)'),0,'小城市', '大城市') from dual通过regexp_instr不匹配时为0的条件,这样就可以完成了 最后一个函数regexp_replaceREGEXP_REPLACE 函数是用另外一个值来替代串中的某个值。例如,可以用一个匹配数字来替代字母的每一次出现。REGEXP_REPLACE的格式如下所示 语法: 4.REGEXP_REPLACE与REPLACE函数相同,替换原字符串中的字符内容 REGEXP_REPLACE(srcstr, pattern [,replacestr [, position [, occurrence [,match_option]]]]) 这个替换函数还是一个非常好用的。如我们在有一个字符串adfadfa (main) next 现在我们要把()替换成<>,这里我们可能想用replace就可以搞定了,但是我们现在做的是(之后必须有)这样的()我们才替换把<>.select regexp_replace('adfadfa (main) next ','(\()([^\)]*)(\))','<\2>') from dualoutput: adfadfa <main> next这里还是一个\做为转义字符。 再来一个ip格式转换的例子吧,我们一般的IP的格式是12.19.168.27现在要不足3位的补足前面为0,结果是012.019.168.027select regexp_replace(regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})','00\1.00\2.00\3.00\4') ,'([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')from dualoutput: 012.019.168.027这里我分成两步来操作,regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})','00\1.00\2.00\3.00\4')我首先让每个小字符串做添加0,这样每个字符串都会大于3,再'([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')这整个字符串分成8段,这样我们只要2、4、6、8这四个段就可以了。 下面一个例子中,在每两个字符之间插入一个空格符SELECT regexp_replace('YAHOO', '(.)', '\1 ') AS output FROM dual; Output: Y A H O O这个用一个循环的方式去操作,还蛮很好的。 select regexp_replace(regexp_replace('12.19.168.27','([^.]+)','00\1') ,'([^.]*)([^.]{3})','\2')from dual接着刚才那个,我们可以把replace循环替换的方式来操作。本回答被网友采纳内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • oracle查询语句中rownum与rowid的不同之处分析
  • 解析oracle 8i/9i的计划稳定性
  • windows本地安装配置oracle客户端完整流程(图文版)
  • oracle 分页问题解决方案
  • ora-28002 oracle 11g存在密码过期问题解决方案
  • 将mysql转换到oracle必须了解的50件事
  • oracle数据库创建备份与恢复脚本整理
  • oracle监听器服务不能启动的解决方法
  • oracle 的入门心得 强烈推荐
  • oracle 将多张表中的列合并到一张表中
  • Oracle正则表达式
  • oracle 正则表达式实现
  • oracle SQL 正则表达式
  • 如何在oracle中使用正则表达式
  • oracle 的正则表达式
  • oracle中使用正则表达式问题
  • 怎么在 oracle 存储过程中 使用正则表达式
  • 如何使用oracle中的正则表达式来获取一段字符串中...
  • oracle 正则表达式?=
  • oracle 可以用正则表达式吗?
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页oracle通过正则表达式分割字符串 regexp_substr的代码详解oracle中正则表达式的使用实例教程oracle 正则表达式实例详解oracle数据库中怎么求除数字、字母之外的非中文字符的正则表达式oracle正则表达式regexp_like的用法详解oracle正则表达式使用介绍oracle 10g:pl/sql正规表达式(正则表达式)手册oracle 正则解决初使化数据格式不一致oracle查询语句中rownum与rowid的不同之处分析解析oracle 8i/9i的计划稳定性windows本地安装配置oracle客户端完整流程(图文版)oracle 分页问题解决方案ora-28002 oracle 11g存在密码过期问题解决方案将mysql转换到oracle必须了解的50件事oracle数据库创建备份与恢复脚本整理oracle监听器服务不能启动的解决方法oracle 的入门心得 强烈推荐oracle 将多张表中的列合并到一张表中oracle 查看表空间的大小及使用情linux系统(x64)安装oracle11g完oracle数据库下载及安装图文操作oracle存储过程基本语法介绍oracle 10g 安装教程[图文]oracle 如何查询被锁定表及如何解基于ora-12170 tns 连接超时解决oracle数据库tns配置方法详解oracle中to_date详细用法示例(ororacle 创建表空间详细介绍全面解析oracle procedure 基本语法oracle异常(预定义异常,自定义异常)应用介oracle如何使用pl/sql调试存储过程oracle导出sql语句的结果集和保存执行的soracle 函数大全详解oracle中的隐含参数_disable_logging收集的oracle函数大全oracle数据更改后出错的解决方法oracle中大批量删除数据的方法oracle 11g安装中出现xhost: unable to o
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved