sql 正则表达式匹配

这个sql正则怎么破啊表名A列名B值123.456.789.0123我现在想获取到值的格式是456789这个怎么写啊... 这个sql正则怎么破啊 表名A 列名B 值 123.456.789.0123 我现在想获取到值的格式是456789 这个怎么写啊 展开
 我来答
Liam22629
2016-01-20 · TA获得超过215个赞
知道答主
回答量:104
采纳率:100%
帮助的人:64.6万
展开全部
  •   当我们要进行一些简单的糊涂查询时用百分号(%),通配符(_)就可以了.其中%表达任意长度的字符串,_表示任意的某一个字符.

  比如

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

  1.   FROM  DUAL;

  DBMS_OUTPUT.PUT_LINE(V_RESULT);

  END;

  结果为hellx world.

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

  如果 REGEXP_REPLACE('hello w


  orld','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

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

百度网友0f37e23c0
2015-04-07 · TA获得超过1543个赞
知道大有可为答主
回答量:1070
采纳率:50%
帮助的人:1295万
展开全部
SELECT
REPLACE( REPLACE( SUBSTRING_INDEX(B, '.', 3), SUBSTRING_INDEX(B, '.', 1), ''),'.','') as 你的值 from TableA;
-----------------------------------------------------------------------------
SELECT REPLACE( REPLACE( SUBSTRING_INDEX('123.456.789.0123', '.', 3),SUBSTRING_INDEX('123.456.789.0123', '.', 1),'' ), '.','')
其中 SUBSTRING_INDEX('123.456.789.0123', '.', 3) 的值为 123.456.789
其中 SUBSTRING_INDEX('123.456.789.0123', '.', 1) 的值为 123
然后进行替换,再替换掉点符号,就可得到,这样比正则效率高。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
阿珠1R
2015-04-07
知道答主
回答量:39
采纳率:0%
帮助的人:16万
展开全部
SELECT
REPLACE( SUBSTR(SUBSTRING_INDEX('123.456.789.0123','.',3),INSTR(SUBSTRING_INDEX('123.456.789.0123','.',3),'.')+1 ),'.','' )
FROM xcenter_infos
WHERE id = 11;
解析:SUBSTRING_INDEX 取第三个.前面的内容INSTR
INSTR 获取第一个.的坐标
SUBSTR 截取 第N个~N个字符
REPLACE 替换.为“”
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
书生无文
2015-04-07 · TA获得超过112个赞
知道小有建树答主
回答量:56
采纳率:100%
帮助的人:20.9万
展开全部
oracle:SELECT regexp_substr(REGEXP_REPLACE('123.456.789.0123', '[.]+','', 1, 2), '[^.]+', 1, 2) AS output from test_user t;试试吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
该用户不存在_3
2015-04-07
知道答主
回答量:7
采纳率:0%
帮助的人:6.8万
展开全部
是要取第一个小数点后和第二个小数点后的值?
追问
恩 对
追答
SELECT REPLACE(SUBSTR('123.456.789.0123',instr( '123.456.789.0123', '.', 1,1 )+1,INSTR('123.456.789.0123','.',-1,1)-instr( '123.456.789.0123', '.', 1,1 )),'.','') FROM DUAL

返回的是第一个小数点后、最后一个小数点前的去除小数点的数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式