前言

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

场景

表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通过一个字段的值将一条记录拆分为多条记录的更多相关文章

  1. PHP多维数组根据其中一个字段的值排序

    平时简单的一维数组或者简单的数组排序这里就不多作介绍,这里主要是针对平时做项目中的可能遇到的情况,根据多维数组中的其中一个排序.用到的php函数是:array_multisort. 思路:获取其中你需 ...

  2. SqlServer数据库设计一个字段的值是由其他字段运算结果所得

    最近在做项目时,发现数据库的一些字段不能执行sql语句进行修改,仔细观察才发现,它是由其他字段运算结果所得.这样就不需程序员通过代码执行运算结果更新数据库,感觉很实用,而网上教材好像还挺少的,所以把教 ...

  3. thinkphp getField("xxxxx", true); 得到一个字段所有值组成的的数组

    很多时候我们只需要一张表里某个字段的值,组成的数组 $Channel = D('channel');$channelList = $Channel->order('user_name')-> ...

  4. MySQL中设置同一张表中一个字段的值等于另一个字段的值

    今天遇到了一个需求,我在一张表中新增了一个字段,因为这张表以前已经有很多数据了,这样对于以前的数据来说,新增的这个字段的值也就是为该字段的默认值,现在需要将新增的这个字段添加上数据,数据来源为同表的另 ...

  5. MySQL 批量修改某一列的值为另外一个字段的值

    mysql> select * from fruit; +----+--------+-------+ | id | name | price | +----+--------+-------+ ...

  6. mysql中如何更新一个字段的值为它本身的值连接上一个字符串

    CONCAT(str1,str2,...)     返回结果为连接参数产生的字符串. 如有任何一个参数为NULL ,则返回值为 NULL. 或许有一个或多个参数. 如果所有参数均为非二进制字符串,则结 ...

  7. mySql一个字段的值模糊匹配多表多列的查询

    1.dao层/** * 分页查询点卡集合信息 * @param tid 游戏类型编号 * @param gid 游戏编号 * @param searchInfo 包括(点卡名称,游戏名称,点卡面值,游 ...

  8. MySQL批量更新一个字段的值为随机数

    $arr = []; $str = ''; for ($i=0; $i < 2660; ++$i) { $str .= " WHEN ".$i." THEN &qu ...

  9. oracle根据某个字段的值进行排序

    需求:按照颜色为蓝色.红色.黄色进行排序: order by  case                  when color = '蓝色' then                   1     ...

随机推荐

  1. php文件路径处理函数

    basename -- 返回路径中的文件名部分 # 语法 string basename ( string $path [, string $suffix ] ) //> 手册例子 echo & ...

  2. 几个不错的echarts +百度地图 案例

    https://echarts.baidu.com/examples/editor.html?c=map-polygon https://echarts.baidu.com/examples/edit ...

  3. Dubbo 高级特性实践-泛化调用

    引言 当后端Java服务用Dubbo协议作为RPC方案的基础,但部分消费方是前端Restful的PHP服务,不能直接调用,于是在中间架设了Router服务提供统一的基于HTTP的后端调用入口. 而Ro ...

  4. 使用awstats分析nginx日志

    1.awstats介绍 本文主要是记录centos6.5下安装配置awstats,并统计nginx访问日志 1.1 awstats介绍 awstats是一款日志统计工具,它使用Perl语言编写,可统计 ...

  5. 29.LINQ初探

    本页内容: 1.LINQ查询语言的组成部分: 2.使用LINQ方法语法: 3.排序查询结果 orderby 字句: 4.聚合运算符: 5.查询复杂对象: 6.投影:在查询中创建新对象: 7.Disti ...

  6. P2577 [ZJOI2005]午餐[DP]

    题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...

  7. margin值为负值

    引用地址:http://www.cnblogs.com/2050/archive/2012/08/13/2636467.html#2457812 http://www.cnblogs.com/jsco ...

  8. C++面向程序设计(第二版)课后习题答案解析

    最近没什么心情整理零散的知识点,就整理一下第四章的课后习题答案. 1.定义一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算.将运算符函数重载为非成员函数,非友元的普通函数.编程序, ...

  9. grep命令选项

    -c:只输出匹配行的计数. -I:不区分大 小写(只适用于单字符). -h:查询多文件时不显示文件名. -l:查询多文件时只输出包含匹配字符的文件名. -n:显示匹配行及 行号. -s:不显示不存在或 ...

  10. DBA 有哪些工作

    首先,我们看看DBA的工作有哪些?DBA的工作实际上都是围绕数据库展开,包含但不限于这些工作: 1. 数据库.主机.操作系统.交换机.存储选型,预算,架构设计,部署,参数优化: 2. 数据库备份.恢复 ...