Oracle通过一个字段的值将一条记录拆分为多条记录「建议收藏」

Oracle通过一个字段的值将一条记录拆分为多条记录「建议收藏」前言 之前遇到了一次这样的需求,当时没有记录,这一次又赶上了,简单的记录一下。 本文个人拙见,若有出入,请指出——来自菜的颤抖 该方式的效率不高,如何优化,请看记Oracle中regexp_subs…

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

代码100分

其中regexp_substr各个参数的含义:

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9989.html

(0)
上一篇 2023-01-28 09:30
下一篇 2023-01-28 10:30

相关推荐

  • Python命令行应用程序的开发利器——Click库

    Python命令行应用程序的开发利器——Click库在现实生活中,我们经常需要使用命令行工具完成一些任务,比如查看系统信息、安装软件等等。此时,我们就需要针对特定的需求进行命令行应用程序的开发。而Python是一门功能强大、易于学习的编程语言,它几乎可以完成所有的任务,同时Python还拥有大量的库来方便我们开发应用程序。尤其是“Click”库,让Python开发者能够用更少的代码完成更多的事情,它简化了命令行工具的基础代码,提供了一种优雅的方式,让我们快速创建Python的命令行应用程序,实现高效的开发和调试。

    2023-12-26
    125
  • 数据库事务与特性「终于解决」

    数据库事务与特性「终于解决」事务是数据库中的一个概念,在交易系统和复杂业务中经常被提及。对于简单的增删改查场景,特别是学习阶段,不需要考虑诸如并发、锁等问题,但是我们要对事务的概念及特性有所了解,以便日后能够快速定位问题和给出…

    2023-03-29
    143
  • 【Redis】入门「建议收藏」

    【Redis】入门「建议收藏」Redis是一个开源的、基于内存的数据结构存储器,可以用作数据库、缓存和消息中间件 Redis最常用的功能 缓存 分布式锁

    2023-02-14
    158
  • Python实现高效的索引查找功能

    Python实现高效的索引查找功能在对数据进行处理时,快速的索引查找功能是非常重要的。Python提供了多种数据结构和算法来实现高效的索引查找,包括列表、元组、字典、集合、二分查找、哈希表等,下面我们将逐一介绍。

    2024-04-10
    73
  • MySQL中MVCC的正确打开方式[通俗易懂]

    MySQL中MVCC的正确打开方式[通俗易懂]最近在学习MySQL中的MVCC,看了网上的各种版本,什么创建版本号、删除版本号,一开始看的时候,好像很对的样子,但实际上很多都是错误的。经过好几天的查阅对比,在几篇博客的帮助下,才算是觉得正确理解…

    2023-03-10
    129
  • 数据库周刊31丨openGauss 正式开源;7月数据库排行榜发布;浙江移动国产数据库AntDB迁移;oracle ADG跨版本搭建;PG解决社保问题;mysqlbinlog解析……

    数据库周刊31丨openGauss 正式开源;7月数据库排行榜发布;浙江移动国产数据库AntDB迁移;oracle ADG跨版本搭建;PG解决社保问题;mysqlbinlog解析……摘要:墨天轮数据库周刊第31期发布啦,每周1次推送本周数据库相关热门资讯、精选文章、干货文档。 热门资讯 1、openGauss 正式开源,华为公开发布源代码【摘要】6月1日,华为正式宣布开源数据库能

    2023-03-19
    155
  • Oracle实例占用超高CPU排查[通俗易懂]

    Oracle实例占用超高CPU排查[通俗易懂]CPU主要功能:处理指令、执行操作、要求进行动作、控制时间、处理数据。 结合数据库实例CPU占用高,可能的原因是数据库在执行大量的操作(全表查询、大量排序等)。 由于公司没有DBA,遇到数据库问题只能

    2023-01-22
    156
  • Redis学习笔记(十七) 集群(上)

    Redis学习笔记(十七) 集群(上)Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移操作。 一个Redis集群通常由多个节点组成,在刚开始的时候每个节点都是相互独立的,他们处于一个只包含

    2023-03-09
    153

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注