查看: 5013|回复: 11

[讨论]重新数据拆分替换----求帮助2

[复制链接]
认证徽章
论坛徽章:
7
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:42:502013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:09ITPUB元老
日期:2013-12-18 11:11:532014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08
发表于 2014-10-22 11:25 | 显示全部楼层 |阅读模式
create table test (id number,name nvarcahr2(20),url navrchar2(200))
insert into test select  1  ,'zz ' ,'  /166/903/2/                '  from dual;
insert into test select  2  ,'xx ' ,' /166/166/            '  from dual;   
insert into test select  66 ,'rr ' ,'/166/                 '  from dual;                                                      
insert into test select  166,'aaa' ,'/1/u2/2/903/                '  from dual;      
insert into test select  903,'ccc' ,'/66/th/ujk01b/bnou/3r/'  from dual;

原始记录 如:
id        name        url     
1         zz           /166/903/2/                    
2         xx          /166/166/                     
66        rr         /166/                                                                              
166       aaa      /1/u2/2/903/                           
903       ccc      /66/th/ujk01b/bnou/3r/                    

你会发现这是一个树,每个/166/1/2/903/66  都有一个值能找到和原始的ID 值相等,从而得出对应的name 替换成现有的这棵树

这里发现  166对应的name:aaa,           结果:  /166/903/2/                                替换为: /aaa/ccc/xx/
              903 对应name:ccc                           /166/166/                               替换为: /aaa/aaa/         
              2对应name:xx                                /1/u2/2/903/                                 替换为:/zz/u2/xx/ccc/
             66对应name:rr                               /66/th/ujk01b/bnou/3r/                  替换为:/rr/th/ujk01b/bnou/3r/        
             1对应name:zz               
请大侠帮助我输出最后的结果,规律是,从URL 中截取每一个  值,和前面的 ID 值相等得出对应的NAME 来替换现在的URL
最后的输出结果
id        name    url
1         zz          /aaa/ccc/xx/            ---URL 都替换NAME
2         xx          /aaa/aaa/  
66        rr         /aaa/         
166       aaa    /zz/u2/xx/ccc/                           
903       ccc    /rr/th/ujk01b/bnou/3r/                                   

论坛徽章:
1
2013年新春福章
日期:2013-02-25 14:51:24
发表于 2014-10-22 11:58 | 显示全部楼层
本帖最后由 ynque 于 2014-10-22 12:00 编辑

替换规律固定的话,可以用replace

SQL> select t.id,
  2         t.name,
  3         replace(replace(replace(replace(replace(t.url, '/166', '/aaa'),
  4                                         '/1',
  5                                         '/zz'),
  6                                 '/2',
  7                                 '/xx'),
  8                         '/903',
  9                         '/ccc'),
10                 '/66',
11                 '/rr')
12    from test t;

        ID NAME                 REPLACE(REPLACE(REPLACE(REPLAC
---------- -------------------- --------------------------------------------------------------------------------
         1 zz                     /aaa/ccc/xx/
         2 xx                    /aaa/aaa/
        66 rr                   /aaa/
       166 aaa                  /zz/u2/xx/ccc/
       903 ccc                  /rr/th/ujk01b/bnou/3r/

使用道具 举报

回复
论坛徽章:
35
ITPUB8周年纪念徽章
日期:2015-09-11 12:12:40慢羊羊
日期:2015-05-15 09:22:38慢羊羊
日期:2015-06-19 09:29:03双鱼座
日期:2015-07-16 13:16:54双子座
日期:2015-08-27 13:16:31射手座
日期:2015-08-28 13:15:55处女座
日期:2015-09-06 15:45:26金牛座
日期:2015-09-17 11:01:38金牛座
日期:2015-11-02 09:28:35双鱼座
日期:2015-12-24 15:20:14
发表于 2014-10-22 12:03 | 显示全部楼层
sql实现比较难。。。写个函数吧。
还得知道把url的哪部分转化为name,哪部分不转化(这几条数据看着是把所有的数字转化了。)

使用道具 举报

回复
认证徽章
论坛徽章:
7
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:42:502013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:09ITPUB元老
日期:2013-12-18 11:11:532014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08
发表于 2014-10-22 13:30 | 显示全部楼层
ynque 发表于 2014-10-22 11:58
替换规律固定的话,可以用replace

SQL> select t.id,

没有任何规律,这样转化,我数据存储上百万条

使用道具 举报

回复
认证徽章
论坛徽章:
7
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:42:502013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:09ITPUB元老
日期:2013-12-18 11:11:532014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08
发表于 2014-10-22 13:32 | 显示全部楼层
lcpp8 发表于 2014-10-22 12:03
sql实现比较难。。。写个函数吧。
还得知道把url的哪部分转化为name,哪部分不转化(这几条数据看着是把所 ...

没有全部转换
/66/th/ujk01b/bnou/3r/
这条数据,就是把 66 转换了,其他的都没有找到对应的ID ,所以不需要转换的。你会发现我的ID 值是数值,这里面截取的是字符,所以肯定不会找到对应的ID

使用道具 举报

回复
论坛徽章:
11
2012新春纪念徽章
日期:2012-01-04 11:56:19技术图书徽章
日期:2017-11-10 14:15:52罗罗诺亚·索隆
日期:2017-08-30 13:50:35马上有钱
日期:2015-02-09 13:21:28优秀写手
日期:2014-12-24 06:00:14蛋疼蛋
日期:2014-12-01 15:24:16比亚迪
日期:2013-09-02 15:14:362013年新春福章
日期:2013-02-25 14:51:24蛋疼蛋
日期:2012-11-18 10:54:53ITPUB 11周年纪念徽章
日期:2012-10-10 13:11:14
发表于 2014-10-22 13:34 | 显示全部楼层
跟上次帖子有什么不同????

使用道具 举报

回复
求职 : 数据库管理员
认证徽章
论坛徽章:
11
ITPUB社区千里马徽章
日期:2013-06-09 10:15:34懒羊羊
日期:2015-03-04 14:52:11懒羊羊
日期:2015-02-10 13:36:05马上有对象
日期:2015-02-02 12:29:02红宝石
日期:2015-01-19 09:44:10马上有车
日期:2014-11-11 14:16:07马上有车
日期:2014-03-27 15:59:39优秀写手
日期:2014-03-12 06:00:13马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09
发表于 2014-10-22 13:46 | 显示全部楼层
同样的问题发两次

使用道具 举报

回复
认证徽章
论坛徽章:
7
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:42:502013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:09ITPUB元老
日期:2013-12-18 11:11:532014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08
发表于 2014-10-22 16:01 | 显示全部楼层
nuaaguang 发表于 2014-10-22 13:34
跟上次帖子有什么不同????

是同一个问题,但是之前可能没有描述清楚,你的那个函数还是没办法满足最后的结果,之前版主写的那个正则也没有查询出最终的结果,还需要继续请教

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-11-07 06:00:13
发表于 2014-10-22 19:42 | 显示全部楼层

  1. select * from (
  2.     SELECT *
  3.     FROM   (SELECT a.*,
  4.                    '/' || b.id || '/' id2,
  5.                    '/' || b.name || '/' name2,
  6.                    row_number() OVER(PARTITION BY a.id ORDER BY 1) seq,
  7.                    COUNT(1) OVER(PARTITION BY a.id) cnt
  8.             FROM   TEST a, TEST b
  9.             WHERE  INSTR(a.url, '/' || b.id(+) || '/') > 0)   
  10.     MODEL PARTITION BY(ID,NAME) DIMENSION BY(seq) MEASURES(id2,name2,URL,URL url2,cnt)
  11.     RULES(url2[ANY]=replace(nvl(url2[CV()-1],URL[CV()]),id2[CV()],name2[CV()]) )
  12. ) WHERE seq=cnt
复制代码

使用道具 举报

回复
论坛徽章:
11
2012新春纪念徽章
日期:2012-01-04 11:56:19技术图书徽章
日期:2017-11-10 14:15:52罗罗诺亚·索隆
日期:2017-08-30 13:50:35马上有钱
日期:2015-02-09 13:21:28优秀写手
日期:2014-12-24 06:00:14蛋疼蛋
日期:2014-12-01 15:24:16比亚迪
日期:2013-09-02 15:14:362013年新春福章
日期:2013-02-25 14:51:24蛋疼蛋
日期:2012-11-18 10:54:53ITPUB 11周年纪念徽章
日期:2012-10-10 13:11:14
发表于 2014-10-23 08:41 | 显示全部楼层
us_yunleiwang 发表于 2014-10-22 16:01
是同一个问题,但是之前可能没有描述清楚,你的那个函数还是没办法满足最后的结果,之前版主写的那个正则 ...

1        1        zz           /166/903/2/                        /aaa/ccc/xx /
2        2        xx          /166/166/                    /aaa/aaa/
3        66        rr         /166/                         /aaa/
4        166        aaa        /1/u2/2/903/                        /zz /u2/xx /ccc/
5        903        ccc        /66/th/ujk01b/bnou/3r/        /rr /th/ujk01b/bnou/3r/

````你执行过吗 ,select  t.*,xx_replace(t.id,t.url)  from test t跟你描述的有什么区别

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表