我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Oracle通过一个字段的值将一条记录拆分为多条记录

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Oracle通过一个字段的值将一条记录拆分为多条记录

Oracle通过一个字段的值将一条记录拆分为多条记录

本文个人拙见,若有出入,请指出——来自菜的颤抖 该方式的效率不高,如何优化,请看记Oracle中regexp_substr函数的一次调优(速度提高99.5%)

场景

表A中存放了集装箱的信息,一个集装箱一条记录,表B中存放了对于集装箱操作的指令,一条指令包括多个集装箱箱号,通过分号;切割(TCIU2347687;XUTR3546865),现在的需求是,对于已经在指令表B中的集装箱,在查询表A时需要过滤掉。

  • 很容易想到的是not in, 然而分号分割。
  • 其次,not like,然而[Err] ORA-01427: 单行子查询返回多个行,表示like后面只接受模糊查询的单个值。

所以必须将分号分割的记录,拆分成单独的记录。 单个记录 变成: 切割后

实现

Oracle可使用regexp_substr函数实现,实现上面切割的sql为:

select regexp_substr("TCIU2347687;XUTR3546865", "[^;]+", 1, level) JZXXH
from dual connect by level <= regexp_count("TCIU2347687;XUTR3546865", ";") + 1

其中regexp_substr各个参数的含义:

  • TCIU2347687;XUTR3546865 表示需要分割匹配的串(我这里只是做了示例,真实情况下是表的字段)。
  • [^;]+典型的正则表达式,我这里分号切割,因此确定分割规则是多个不是分号的字符,因此遇到分号便结束,完成一个串的获取。
  • 1开始位置,最左端(Oracle下标都是1开始
  • level表示第几个匹配上的。 为了直观点搞清楚这个函数,比如下面的语句:
select REGEXP_SUBSTR("aaa;bbb","[^;]+",1,1) AS STR FROM dual; 

结果就是aaa, 如果把第二个1变成2,输出就是bbb。 好了,这部分意图很明显了,下面就是把它每一个切割串取出来,看到上面取level个,而这个level是个什么东西呢,在这个之前,先看regexp_count(string, c)函数,这个函数其实很好理解,返回string中c的个数。 然后就是这个level,这是一个伪列,和RowNum相似,

SELECT LEVEL FROM DUAL CONNECT BY LEVEL <=2; 

level 所以再回到最初的sql,也就很好理解了。

最后

此致,敬礼


欢迎赏脸关注:家佳Talk

欢迎赏脸关注:家佳Talk

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Oracle通过一个字段的值将一条记录拆分为多条记录

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Oracle通过一个字段的值将一条记录拆分为多条记录

本文个人拙见,若有出入,请指出——来自菜的颤抖该方式的效率不高,如何优化,请看记Oracle中regexp_substr函数的一次调优(速度提高99.5%)场景表A中存放了集装箱的信息,一个集装箱一条记录,表B中存放了对于集装箱操作的指令,一条指令包括多个集装
Oracle通过一个字段的值将一条记录拆分为多条记录
2022-01-14

编程热搜

目录