美文网首页
Oracle通过一个字段的值将一条记录拆分为多条记录

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

作者: DuBetter | 来源:发表于2019-08-16 17:59 被阅读0次

前言

之前遇到了一次这样的需求,当时没有记录,这一次又赶上了,简单的记录一下。

本文个人拙见,若有出入,请指出——来自菜的颤抖
该方式的效率不高,如何优化,请看记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,也就很好理解了。

最后

此致,敬礼


相关文章

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

    前言 之前遇到了一次这样的需求,当时没有记录,这一次又赶上了,简单的记录一下。 本文个人拙见,若有出入,请指出——...

  • 窗口函数总结

    一、窗口函数是什么 窗口函数不会进行聚合,将多条记录按照分组字段聚合成一条记录。而是通过移动窗口,对每一条记录进行...

  • sql(join,group,concat)

    MySQL数据库将多条记录的单个字段合并成一条记录 Join 数据库2张表 app表和appProduct表,一个...

  • Oracle sql记录

    oracle查询上一条记录的字段显示下一条记录该字段数据:select OP_TIME,lag(OP_TIME,1...

  • TP常用数据库命令

    1.查询一条记录: 2.查询多条记录: 3.查询一个字段: 4.where多条件查询: 5.更新某一个字段: 6....

  • mysql表管理

    管理表结构:1.插入 添加一条记录,给所有字段赋值 添加一条记录,指定字段赋值ps:字段值要与字段类型相匹配 字符...

  • MySQL 相关问题解决

    查询结果多条件排序 在_allHotels表的cpdr字段后面添加一个字段rank 查询最新一条记录 假设表tab...

  • 笔记

    插入一条数据 INSERT INTO 表名 (字段,字段) VALUES (值,值); 插入多条数据 INSERT...

  • sqlserver查询一对多的关系、合并多条记录的某字段值到一个

    sqlserver查询一对多的关系、合并多条记录的某字段值到一个字段 需求场景 现有如下两个表格construct...

  • oracle根据某个字段拆分成多条数据

    记一次ORACLE根据某个字段分割,将一条数据拆分成多条 未拆分前的数据: 拆分后的数据:

网友评论

      本文标题:Oracle通过一个字段的值将一条记录拆分为多条记录

      本文链接:https://www.haomeiwen.com/subject/rewqsctx.html