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 数据仓库ETL技术之多表插入语句的示例详解
Apr 12 Oracle
oracle表分区的概念及操作
Apr 24 Oracle
mybatis使用oracle进行添加数据的方法
Apr 27 Oracle
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
Jun 04 Oracle
ORACLE数据库应用开发的三十个注意事项
Jun 07 Oracle
C#连接ORACLE出现乱码问题的解决方法
Oct 05 Oracle
关于Oracle12C默认用户名system密码不正确的解决方案
Oct 16 Oracle
详细聊聊Oracle表碎片对性能有多大的影响
Mar 19 Oracle
详解SQL的窗口函数
Apr 21 Oracle
分析SQL窗口函数之取值窗口函数
Apr 21 Oracle
SQL试题 使用窗口函数选出连续3天登录的用户
Apr 24 Oracle
ORACLE中dbms_output.put_line输出问题的解决过程
Jun 28 Oracle
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
ORACLE查看当前账号的相关信息
DBCA命令行搭建Oracle ADG的流程
ORACLE数据库应用开发的三十个注意事项
Jun 07 #Oracle
Oracle创建只读账号的详细步骤
You might like
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
PHP学习之整理字符串
2011/04/17 PHP
PHP中3种生成XML文件方法的速度效率比较
2012/10/06 PHP
php判断并删除空目录及空子目录的方法
2015/02/11 PHP
使用正则去除php代码中的注释方法
2016/11/03 PHP
发现的以前不知道的函数
2006/09/19 Javascript
浅析JS刷新框架中的其他页面 &amp;&amp; JS刷新窗口方法汇总
2013/07/08 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
2013/08/07 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
在vue项目中使用element-ui的Upload上传组件的示例
2018/02/08 Javascript
vue路由插件之vue-route
2019/06/13 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
Python原始字符串(raw strings)用法实例
2014/10/13 Python
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
python 矩阵增加一行或一列的实例
2018/04/04 Python
Python下简易的单例模式详解
2019/04/08 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
Python 从attribute到property详解
2020/03/05 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
2020/04/08 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
css3针对移动端卡顿问题的解决(动画性能优化)
2020/02/14 HTML / CSS
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
欧尚俄罗斯网上超市:Auchan俄罗斯
2018/05/03 全球购物
成立公司计划书
2014/05/07 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
见习报告的格式
2014/10/31 职场文书
优秀员工推荐材料
2014/12/20 职场文书
五好家庭事迹材料
2014/12/20 职场文书
工厂无线对讲系统解决方案
2022/02/18 无线电
Python进程池与进程锁之语法学习
2022/04/11 Python