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
mybatis使用oracle进行添加数据的方法
Apr 27 Oracle
oracle通过存储过程上传list保存功能
May 12 Oracle
Oracle更换为MySQL遇到的问题及解决
May 21 Oracle
oracle重置序列从0开始递增1
Feb 28 Oracle
oracle删除超过N天数据脚本的方法
Feb 28 Oracle
详细聊聊Oracle表碎片对性能有多大的影响
Mar 19 Oracle
分析SQL窗口函数之排名窗口函数
Apr 21 Oracle
解决Oracle数据库用户密码过期
May 11 Oracle
在Oracle表中进行关键词搜索的过程
Jun 10 Oracle
oracle delete误删除表数据后如何恢复
Jun 28 Oracle
oracle设置密码复杂度及设置超时退出的功能
Jun 28 Oracle
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
ORACLE查看当前账号的相关信息
DBCA命令行搭建Oracle ADG的流程
ORACLE数据库应用开发的三十个注意事项
Jun 07 #Oracle
Oracle创建只读账号的详细步骤
You might like
PHP中cookies使用指南
2007/03/16 PHP
php中邮箱地址正则表达式实现与详解
2012/04/24 PHP
深入PHP数据加密详解
2013/06/18 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
2018/09/04 PHP
Javascript typeof 用法
2008/12/28 Javascript
jQuery中选择器小问题(新人难免遇到)
2014/03/31 Javascript
D3.js中data(), enter() 和 exit()的问题详解
2015/08/17 Javascript
JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
2017/01/06 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
详解写好JS条件语句的5条守则
2019/02/28 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
python实现ftp客户端示例分享
2014/02/17 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
运行python提示no module named sklearn的解决方法
2020/11/29 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
css3 transform 3d 使用css3创建动态3d立方体(html5实践)
2013/01/06 HTML / CSS
HTML5移动端手机网站开发流程
2016/04/25 HTML / CSS
de Bijenkorf比利时官网:荷兰最知名的百货商店
2017/06/29 全球购物
暑期社会实践方案
2014/02/05 职场文书
食品工程专业求职信
2014/06/15 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
离婚案件答辩状
2015/05/22 职场文书
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python
Python数据分析入门之数据读取与存储
2021/05/13 Python
解决MySQL Varchar 类型尾部空格的问题
2022/04/06 MySQL