Oracle通过一个字段的值将一条记录拆分为多条记录
前言
之前遇到了一次这样的需求,当时没有记录,这一次又赶上了,简单的记录一下。
场景
表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;
所以再回到最初的sql,也就很好理解了。
最后
- 本文内容个人拙见,若有出入,欢迎指正。
- 欢迎赏脸关注:家佳Talk
Oracle通过一个字段的值将一条记录拆分为多条记录的更多相关文章
- PHP多维数组根据其中一个字段的值排序
平时简单的一维数组或者简单的数组排序这里就不多作介绍,这里主要是针对平时做项目中的可能遇到的情况,根据多维数组中的其中一个排序.用到的php函数是:array_multisort. 思路:获取其中你需 ...
- SqlServer数据库设计一个字段的值是由其他字段运算结果所得
最近在做项目时,发现数据库的一些字段不能执行sql语句进行修改,仔细观察才发现,它是由其他字段运算结果所得.这样就不需程序员通过代码执行运算结果更新数据库,感觉很实用,而网上教材好像还挺少的,所以把教 ...
- thinkphp getField("xxxxx", true); 得到一个字段所有值组成的的数组
很多时候我们只需要一张表里某个字段的值,组成的数组 $Channel = D('channel');$channelList = $Channel->order('user_name')-> ...
- MySQL中设置同一张表中一个字段的值等于另一个字段的值
今天遇到了一个需求,我在一张表中新增了一个字段,因为这张表以前已经有很多数据了,这样对于以前的数据来说,新增的这个字段的值也就是为该字段的默认值,现在需要将新增的这个字段添加上数据,数据来源为同表的另 ...
- MySQL 批量修改某一列的值为另外一个字段的值
mysql> select * from fruit; +----+--------+-------+ | id | name | price | +----+--------+-------+ ...
- mysql中如何更新一个字段的值为它本身的值连接上一个字符串
CONCAT(str1,str2,...) 返回结果为连接参数产生的字符串. 如有任何一个参数为NULL ,则返回值为 NULL. 或许有一个或多个参数. 如果所有参数均为非二进制字符串,则结 ...
- mySql一个字段的值模糊匹配多表多列的查询
1.dao层/** * 分页查询点卡集合信息 * @param tid 游戏类型编号 * @param gid 游戏编号 * @param searchInfo 包括(点卡名称,游戏名称,点卡面值,游 ...
- MySQL批量更新一个字段的值为随机数
$arr = []; $str = ''; for ($i=0; $i < 2660; ++$i) { $str .= " WHEN ".$i." THEN &qu ...
- oracle根据某个字段的值进行排序
需求:按照颜色为蓝色.红色.黄色进行排序: order by case when color = '蓝色' then 1 ...
随机推荐
- Node.js学习之(第二章:exports和module.exports)
前言 Node中,每个模块都有一个exports接口对象,我们需要把公共的方法或者字符串挂载在这个接口对象中,其他的模块才可以使用. Node.js中只有模块作用域,默认两个模块之间的变量,方法互不冲 ...
- org.apache.shiro.session.UnknownSessionException: There is no session with id [xxxx]的解决方案
org.apache.shiro.session.UnknownSessionException: There is no session with id [xxxx]的解决方案 背景描述 Sprin ...
- Vue路由传参的几种方式
原 Vue路由传参的几种方式 2018年07月28日 23:52:40 广积粮缓称王 阅读数 12613 前言:顾名思义,vue路由传参是指嵌套路由时父路由向子路由传递参数,否则操作无效.传参方式 ...
- 无法将文件“E:\NetWorkPace\Permission\packages\EntityFramework.6.1.1\lib\net45\EntityFramework.xml”复制到“bin\EntityFramework.xml”。对路径“bin\EntityFramework.xml”的访问被拒绝。
无法将文件“E:\NetWorkPace\Permission\packages\EntityFramework.6.1.1\lib\net45\EntityFramework.xml”复制到“bin ...
- 【JUC】5.线程池—Executor
创建线程池可以分为三种方式: 1. 通过ThreadPoolExecutor的构造方法,创建ThreadPoolExecutor的对象,即一个线程池对象: 此构造方法,一共7个参数,5个必须参数,2个 ...
- Android笔记(五十六) Android四大组件之一——ContentProvider,实现自己的ContentProvider
有时候我们自己的程序也需要向外接提供数据,那么就需要我们自己实现ContentProvider. 自己实现ContentProvider的话需要新建一个类去继承ContentProvider,然后重写 ...
- hive 外部表和内部表的区别和相互转换
Hive内部表和外部表区别 1.创建内部表时,内部表的数据文件是保存在指定的路径的:如若创建外部表,则只记录数据所在的路径,不会对数据位置做改变. 2.删除表的时候,内部表元数据和数据会跟着一起删除. ...
- CentOS 7.6最小化安装(系统盘和数据盘分离安装)
CentOS 7.6最小化安装(系统盘和数据盘分离安装) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.创建虚拟机 鉴于大家使用的平台操作系统可能不尽相同,博主精力有限,仅演示 ...
- 桂电深信服CTF之MSC真假压缩包
真假压缩包-复现(吐槽一句,脑洞真特么大) 先从虚假的入手,一开始猜测虚假的是伪加密,后面也确实是 后面打开压缩包,是一个txt文件 一眼可以看出来是RSA,算出来明文是5(于是就在这里卡了两天,一直 ...
- java 图片base64互转
public class ImgBase64 { public static void main(String[] args) //测试 { String strImg = GetImageStr() ...