Oracle以逗号分隔的字符串拆分为多行数据实例详解


Posted in Oracle onJuly 16, 2021

前言

近期在工作中遇到某表某字段是可扩展数据内容,信息以逗号分隔生成的,现需求要根据此字段数据在其它表查询相关的内容展现出来,第一想法是切割数据,以逗号作为切割符,以下为总结的实现方法,以供大家参考、指教。

Oracle以逗号分隔的字符串拆分为多行数据实例详解

1、regexp_substr函数,通过正则来拆分字符串,函数用法为:(必须是oracle 10g+的版本才支持)

 REGEXP_SUBSTR函数格式如下:

function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)

__srcstr :需要进行正则处理的字符串

__pattern :进行匹配的正则表达式

__position :起始位置,从第几个字符开始正则表达式匹配(默认为1)

__occurrence :获取第几个分割出来的组(分割后最初的字符串会按分割的顺序排列成组),默认为1

__modifier :模式('i'不区分大小写进行检索;'c'区分大小写进行检索。默认为'c'。)针对的是正则表达式里字符大小写的匹配

-------------------------------------------------------------------------------------------------------------------

Oracle以逗号分隔的字符串拆分为多行数据实例详解

  此函数只能每次取一个字符串出来,有点鸡肋,字符串中逗号的数量是不确定的,如果有2个逗号,需要提取的字段就是3个。为了确定有多少个需要提取的字段,需要用到connect by命令实现动态参数构造连续的值,通过原字符串长度和被替换后字符串长度相减,可以得到原字符串中的逗号数量,加1后得到需要提取的匹配字段数量。

Oracle以逗号分隔的字符串拆分为多行数据实例详解

 SQL:

select bs from cs1_0 where slid='201804100038'
--正则分割后的第一个值
SELECT REGEXP_SUBSTR((select bs from cs1_0 where slid='201804100038'),'[^,]+',1,1,'i') as 分割后结果 FROM DUAL;
--获取一个多个数值的列,从而能够让结果以多行的形式展示出来 
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <=5;
--将上面REGEXP_SUBSTR的occurrence(标识第几个匹配组)实现动态参数,使用 connect by组合起来
SELECT REGEXP_SUBSTR((select bs from cs1_0 where slid='201804100038'),'[^,]+',1,LEVEL,'i') as 分割后结果 FROM DUAL CONNECT BY LEVEL <=5;
--优化一下(动态获匹配组标识行数)
select regexp_substr((select bs from cs1_0 where slid='201804100038'),'[^,]+',1,LEVEL,'i') as 分割后结果 from dual 
connect by level <= length((select bs from cs1_0 where slid='201804100038'))-length(regexp_replace((select bs from cs1_0 where slid='201804100038'),',',''))+1;

2、以Type类型和function函数的方式实现

1)建立TYPE类型


CREATE OR REPLACE TYPE strsplit_type_12 IS TABLE OF VARCHAR2 (4000)

2)建立function存储函数
create or replace function strsplit_66(p_value varchar2,p_split varchar2 )  --字符串,切割符
--根据特定字符来切割字符串
 return strsplit_type_12
  pipelined is
  v_idx       integer;
  v_str       varchar2(500);
  v_strs_last varchar2(4000) := p_value;

begin
  loop
    v_idx := instr(v_strs_last, p_split);
    exit when v_idx = 0;
    v_str       := substr(v_strs_last, 1, v_idx - 1);
    v_strs_last := substr(v_strs_last, v_idx + 1);
    pipe row(v_str);
  end loop;
  pipe row(v_strs_last);
  return;
end strsplit_66;

SELECT ROWNUM 序号, a.* FROM TABLE(strsplit_66((select bs from cs1_0 where slid='201804100038'), ',')) a;

 测试一下:

Oracle以逗号分隔的字符串拆分为多行数据实例详解

总结

到此这篇关于Oracle以逗号分隔的字符串拆分为多行数据的文章就介绍到这了,更多相关Oracle拆分多行数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Oracle 相关文章推荐
Oracle笔记
Apr 05 Oracle
Oracle创建只读账号的详细步骤
Jun 07 Oracle
RPM包方式安装Oracle21c的方法详解
Aug 23 Oracle
Oracle安装TNS_ADMIN环境变量设置参考
Nov 01 Oracle
详解Oracle块修改跟踪功能
Nov 07 Oracle
Oracle表空间与权限的深入讲解
Nov 17 Oracle
使用Oracle命令进行数据库备份与还原
Dec 06 Oracle
详细聊聊Oracle表碎片对性能有多大的影响
Mar 19 Oracle
Lakehouse数据湖并发控制陷阱分析
Mar 31 Oracle
分析SQL窗口函数之排名窗口函数
Apr 21 Oracle
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
ORACLE查看当前账号的相关信息
DBCA命令行搭建Oracle ADG的流程
ORACLE数据库应用开发的三十个注意事项
Jun 07 #Oracle
Oracle创建只读账号的详细步骤
You might like
PHP之变量、常量学习笔记
2008/03/27 PHP
PHP 替换模板变量实现步骤
2009/08/24 PHP
PHP+MySQL 制作简单的留言本
2009/11/02 PHP
ThinkPHP采用模块和操作分析
2011/04/18 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
PHP中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
php curl发送请求实例方法
2019/08/01 PHP
Jquery实现简单的动画效果代码
2012/03/18 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
jQuery插件datalist实现很好看的input下拉列表
2015/07/14 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
Node.js学习之TCP/IP数据通讯(实例讲解)
2017/10/11 Javascript
JS使用队列对数组排列,基数排序算法示例
2019/03/02 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
使用Python做垃圾分类的原理及实例代码附源码
2019/07/02 Python
Python使用贪婪算法解决问题
2019/10/22 Python
基于Python组装jmx并调用JMeter实现压力测试
2020/11/03 Python
css3边框_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
Puma印度官网:德国运动品牌
2019/10/06 全球购物
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
经典的班主任推荐信
2013/10/28 职场文书
12岁生日演讲稿
2014/05/14 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
2015国际残疾人日活动总结
2015/03/24 职场文书
高中美术教学反思
2016/02/17 职场文书
深入理解pytorch库的dockerfile
2022/06/10 Python