查看: 20879|回复: 10

【大话IT】同一行两个字段匹配,已下划线分隔,精确匹配出结果

[复制链接]
论坛徽章:
4
阿斯顿马丁
日期:2013-08-08 21:36:33优秀写手
日期:2014-03-12 06:00:132015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39
发表于 2015-2-10 19:50 | 显示全部楼层 |阅读模式

with t as(select  '92_93_94_96_98' as str,8    as id from dual union all
select  '92_93_94_96_98' as str,2    as id from dual union all
select  '92_93_94_96_98' as str,92   as id from dual union all
select  '92_93_94_96_98' as str,98   as id from dual union all
select  '92_93_94_96_98' as str,96   as id from dual union all
select  '92_93_94_96_98' as str,4    as id from dual union all
select  '92_93_94_96_98' as str,6    as id from dual union all
select  '92_93_94_96_98' as str,9    as id from dual union all
select  '92_93_94_96_98' as str,94   as id from dual union all
select  '92_93_94_96_98' as str,3    as id from dual union all
select  '92_93_94_96_98' as str,93   as id from dual)
select  * from  t
where regexp_like(str,id)


数据:

STR        ID
92_93_94_96_98        8
92_93_94_96_98        2
92_93_94_96_98        92
92_93_94_96_98        98
92_93_94_96_98        96
92_93_94_96_98        4
92_93_94_96_98        6
92_93_94_96_98        9
92_93_94_96_98        94
92_93_94_96_98        3
92_93_94_96_98        93



最终需求: 已下划线分隔,精确匹配

STR        ID
92_93_94_96_98        92
92_93_94_96_98        98
92_93_94_96_98        96
92_93_94_96_98        94
92_93_94_96_98        93



谢谢!
论坛徽章:
17
蛋疼蛋
日期:2012-04-27 23:09:45罗罗诺亚·索隆
日期:2016-11-04 21:04:09懒羊羊
日期:2015-06-23 09:05:532015年新春福章
日期:2015-04-01 14:21:232015年新春福章
日期:2015-03-06 11:58:39慢羊羊
日期:2015-03-04 14:53:33青年奥林匹克运动会-击剑
日期:2014-08-29 15:44:44马上加薪
日期:2014-02-18 16:48:492014年新春福章
日期:2014-02-18 16:48:49一汽
日期:2013-12-24 18:12:09
发表于 2015-2-10 21:08 | 显示全部楼层
  1. with t as(select  '92_93_94_96_98' as str,8    as id from dual union all
  2. select  '92_93_94_96_98' as str,2    as id from dual union all
  3. select  '92_93_94_96_98' as str,92   as id from dual union all
  4. select  '92_93_94_96_98' as str,98   as id from dual union all
  5. select  '92_93_94_96_98' as str,96   as id from dual union all
  6. select  '92_93_94_96_98' as str,4    as id from dual union all
  7. select  '92_93_94_96_98' as str,6    as id from dual union all
  8. select  '92_93_94_96_98' as str,9    as id from dual union all
  9. select  '92_93_94_96_98' as str,94   as id from dual union all
  10. select  '92_93_94_96_98' as str,3    as id from dual union all
  11. select  '92_93_94_96_98' as str,93   as id from dual)
  12. select str, id
  13.   from (select id, str, regexp_substr(str, '[^_]+', 1, level) xxoo
  14.           from t
  15.         connect by level <= regexp_count(str,'_')+1
  16.                and prior id = id
  17.                and prior dbms_random.value() is not null)
  18. where id = xxoo;
复制代码

使用道具 举报

回复
论坛徽章:
18
奥迪
日期:2014-01-23 17:13:08喜羊羊
日期:2015-05-29 07:20:492015年新春福章
日期:2015-03-06 11:59:472015年新春福章
日期:2015-03-04 14:55:13马上加薪
日期:2014-10-22 11:08:29itpub13周年纪念徽章
日期:2014-10-10 07:09:53生肖徽章:蛇
日期:2014-06-19 17:10:12生肖徽章:龙
日期:2014-06-19 17:10:12 2014年世界杯参赛球队: 德国
日期:2014-06-13 10:14:37优秀写手
日期:2014-05-14 06:00:20
发表于 2015-2-10 21:11 | 显示全部楼层
Here's a solution, though not good enough:
with t as(select  '92_93_94_96_98' as str,8    as id from dual union all
select  '92_93_94_96_98' as str,2    as id from dual union all
select  '92_93_94_96_98' as str,92   as id from dual union all
select  '92_93_94_96_98' as str,98   as id from dual union all
select  '92_93_94_96_98' as str,96   as id from dual union all
select  '92_93_94_96_98' as str,4    as id from dual union all
select  '92_93_94_96_98' as str,6    as id from dual union all
select  '92_93_94_96_98' as str,9    as id from dual union all
select  '92_93_94_96_98' as str,94   as id from dual union all
select  '92_93_94_96_98' as str,3    as id from dual union all
select  '92_93_94_96_98' as str,93   as id from dual)
select  str, id from  t
where regexp_like('_'||str||'_','_'||id||'_');

使用道具 举报

回复
论坛徽章:
10000
地主之星
日期:2015-07-20 17:15:36地主之星
日期:2015-09-01 14:14:25地主之星
日期:2015-09-01 17:59:09地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58
发表于 2015-2-10 21:12 | 显示全部楼层
instr('-'||str||'-','-'||id||'-') > 0

使用道具 举报

回复
论坛徽章:
10000
地主之星
日期:2015-07-20 17:15:36地主之星
日期:2015-09-01 14:14:25地主之星
日期:2015-09-01 17:59:09地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58
发表于 2015-2-10 21:18 | 显示全部楼层
YuBinTAMU 发表于 2015-2-10 21:11
Here's a solution, though not good enough:
with t as(select  '92_93_94_96_98' as str,8    as id fro ...

兄台,已打入邪恶的美利坚?

使用道具 举报

回复
论坛徽章:
18
奥迪
日期:2014-01-23 17:13:08喜羊羊
日期:2015-05-29 07:20:492015年新春福章
日期:2015-03-06 11:59:472015年新春福章
日期:2015-03-04 14:55:13马上加薪
日期:2014-10-22 11:08:29itpub13周年纪念徽章
日期:2014-10-10 07:09:53生肖徽章:蛇
日期:2014-06-19 17:10:12生肖徽章:龙
日期:2014-06-19 17:10:12 2014年世界杯参赛球队: 德国
日期:2014-06-13 10:14:37优秀写手
日期:2014-05-14 06:00:20
发表于 2015-2-10 21:19 | 显示全部楼层
Ok, the better solution I thought:
with t as(select  '92_93_94_96_98' as str,8    as id from dual union all
select  '92_93_94_96_98' as str,2    as id from dual union all
select  '92_93_94_96_98' as str,92   as id from dual union all
select  '92_93_94_96_98' as str,98   as id from dual union all
select  '92_93_94_96_98' as str,96   as id from dual union all
select  '92_93_94_96_98' as str,4    as id from dual union all
select  '92_93_94_96_98' as str,6    as id from dual union all
select  '92_93_94_96_98' as str,9    as id from dual union all
select  '92_93_94_96_98' as str,94   as id from dual union all
select  '92_93_94_96_98' as str,3    as id from dual union all
select  '92_93_94_96_98' as str,93   as id from dual)
select  str, id from  t
where regexp_like(str,'(^|_)'||id||'(_|$)');

Thanks to the post that have me learnt more about regexp

使用道具 举报

回复
论坛徽章:
18
奥迪
日期:2014-01-23 17:13:08喜羊羊
日期:2015-05-29 07:20:492015年新春福章
日期:2015-03-06 11:59:472015年新春福章
日期:2015-03-04 14:55:13马上加薪
日期:2014-10-22 11:08:29itpub13周年纪念徽章
日期:2014-10-10 07:09:53生肖徽章:蛇
日期:2014-06-19 17:10:12生肖徽章:龙
日期:2014-06-19 17:10:12 2014年世界杯参赛球队: 德国
日期:2014-06-13 10:14:37优秀写手
日期:2014-05-14 06:00:20
发表于 2015-2-10 21:24 | 显示全部楼层
jboracle1981 发表于 2015-2-10 08:18
兄台,已打入邪恶的美利坚?

Not 邪恶的美利坚 but beautiful Canada

使用道具 举报

回复
论坛徽章:
10000
地主之星
日期:2015-07-20 17:15:36地主之星
日期:2015-09-01 14:14:25地主之星
日期:2015-09-01 17:59:09地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58地主之星
日期:2015-08-31 16:17:58
发表于 2015-2-10 21:31 | 显示全部楼层
YuBinTAMU 发表于 2015-2-10 21:24
Not 邪恶的美利坚 but beautiful Canada

使用道具 举报

回复
论坛徽章:
4
阿斯顿马丁
日期:2013-08-08 21:36:33优秀写手
日期:2014-03-12 06:00:132015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39
 楼主| 发表于 2015-2-10 21:33 | 显示全部楼层
谢谢,两位解答

使用道具 举报

回复
论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2015-2-10 21:36 | 显示全部楼层
jboracle1981 发表于 2015-2-10 21:12
instr('-'||str||'-','-'||id||'-') > 0

这个简单易学

使用道具 举报

回复

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

本版积分规则 发表回复

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