免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1943 | 回复: 7

问个过程如何写 [复制链接]

论坛徽章:
0
发表于 2010-08-11 16:24 |显示全部楼层
1 [1-1-67]
2 [1-1-1]
3 [1-1-66]
4 [1-1-2]
5 [1-1-3]
6 [1-1-4]
7 [1-1-5]
8 [1-1-7]
9 [1-1-8-1]
10 [1-1-8-2]
11 [1-1-8-3]
12 [1-1-9-1]
13 [1-1-9-2]

我想找到第2个和第3个之间的数字。 有的一个里面有3个数字。
我现在自己有思路但是对ORACLE不太熟悉。我的思路是
一,[ ]之间有几个 -
二,如果 = 2 个 第二个 - 到 ]  之间的数字就是我要取得的
    如果 > 2 个 第二个 - 到 第三个 -  之间的数字就是我要取得的

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
发表于 2010-08-11 16:55 |显示全部楼层
http://blog.csdn.net/believefym/archive/2009/01/15/3791122.aspx

看看上面的。建议,先把[]去掉。然后以-分割。得到长度大于等于3,取第3个。否则不取。

论坛徽章:
0
发表于 2010-08-11 18:03 |显示全部楼层
10g以上的话,应该有可能可以用正则来做,
不过我没研究过,谁来试试

论坛徽章:
0
发表于 2010-08-12 09:30 |显示全部楼层
恩,确实有点复杂

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
发表于 2010-08-12 11:25 |显示全部楼层
10g以上的话,应该有可能可以用正则来做,
不过我没研究过,谁来试试
doni 发表于 2010-08-11 18:03



    根据你的思路:
  1. select regexp_replace('1 [1-1-67]','(\d\s\[\d+\-\d+\-)(\d+)((\-?\d+)*\])','\2') from dual;
复制代码
如果他的数据都在表里就把‘1 [xxx'这段数据换成他的字段,dual换成表名。但目前这个语句对'1 [1-1]'这样的数据替换不出来,对有两个及以上的‘-’是可以的。

论坛徽章:
0
发表于 2010-08-12 11:25 |显示全部楼层
本帖最后由 doni 于 2010-08-12 11:26 编辑

用instr确定第二个'-'的位置a,第三个'-'的位置b
但问题在于可能没有第三个'-',所以instr会返回0,这个时候要用decode来处理,换成']'的位置b

substr(str,a+1,b-a-1)

这个比较麻烦,偷下懒,LZ自己拼一下吧

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
发表于 2010-08-12 12:06 |显示全部楼层
我再来给楼主两个答案,还是用doni说的正则表达式完成。
1、用case
  1. select case length(regexp_replace('1 [1-1-67-21-34]','[^\-]+',''))
  2.     when 0 then ''
  3.     when 1 then ''
  4.     else regexp_replace('1 [1-1-67-21-34]','(\d\s\[\d+\-\d+\-)(\d+)((\-?\d+)*\])','\2') end
  5.       from dual;
复制代码
同理,如果数据是在表中,记得把'1 [1-1-67-21-34]'换成你的表字段,把dual换成表。

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
发表于 2010-08-12 12:11 |显示全部楼层
2、用decode函数:
  1. select decode(length(regexp_replace('1 [1-1-67-21-34]','[^\-]+','')),0,'',1,'', regexp_replace('1 [1-1-67-21-34]','(\d\s\[\d+\-\d+\-)(\d+)((\-?\d+)*\])','\2')) from dual;
复制代码
同理,如果数据是在表中,记得把'1 [1-1-67-21-34]'换成你的表字段,把dual换成表。

PS:doni说了,正则是10G以后才有的,所以这个问题如果在9及以前的版本,不能用正则来处理,可能就要用存储过程了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP