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 相关文章推荐
zabbix agent2 监控oracle数据库的方法
May 13 Oracle
Oracle 区块链表创建过程详解
May 15 Oracle
oracle覆盖导入dmp文件的2种方法
May 21 Oracle
Oracle 临时表空间SQL语句的实现
Sep 25 Oracle
Oracle中update和select 关联操作
Jan 18 Oracle
Oracle 触发器trigger使用案例
Feb 24 Oracle
oracle重置序列从0开始递增1
Feb 28 Oracle
Oracle 多表查询基本语法实例
Apr 18 Oracle
instantclient客户端 连接oracle数据库
Apr 26 Oracle
Oracle删除归档日志及添加定时任务
Jun 28 Oracle
Oracle中日期的使用方法实例
Jul 07 Oracle
Oracle查看表空间使用率以及爆满解决方案详解
Jul 23 Oracle
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
ORACLE查看当前账号的相关信息
DBCA命令行搭建Oracle ADG的流程
ORACLE数据库应用开发的三十个注意事项
Jun 07 #Oracle
Oracle创建只读账号的详细步骤
You might like
php 无限分类的树类代码
2009/12/03 PHP
php 归并排序 数组交集
2011/05/10 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
2014/08/30 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
jQuery替换textarea中换行的方法
2015/06/10 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
学习Vue组件实例
2018/04/28 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
原生JavaScript之es6中Class的用法分析
2020/02/23 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
[42:32]Secret vs Optic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
采用python实现简单QQ单用户机器人的方法
2014/07/03 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
2018/05/26 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
2019/08/02 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
pandas针对excel处理的实现
2021/01/15 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
一些Solaris面试题
2013/03/22 面试题
体育教育专业自荐信范文
2013/12/20 职场文书
西门豹教学反思
2014/02/04 职场文书
供货协议书范本
2014/04/22 职场文书
2014年文明创建工作总结
2014/11/25 职场文书
法院个人总结
2015/03/03 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js