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
Oracle设置DB、监听和EM开机启动的方法
Apr 25 Oracle
使用Navicat Premium工具将oracle数据库迁移到MySQL
May 27 Oracle
RPM包方式安装Oracle21c的方法详解
Aug 23 Oracle
关于Oracle12C默认用户名system密码不正确的解决方案
Oct 16 Oracle
详解Oracle块修改跟踪功能
Nov 07 Oracle
Oracle 触发器trigger使用案例
Feb 24 Oracle
清空 Oracle 安装记录并重新安装
Apr 26 Oracle
instantclient客户端 连接oracle数据库
Apr 26 Oracle
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
ORACLE查看当前账号的相关信息
DBCA命令行搭建Oracle ADG的流程
ORACLE数据库应用开发的三十个注意事项
Jun 07 #Oracle
Oracle创建只读账号的详细步骤
You might like
PHP 如何利用phpexcel导入数据库
2013/08/24 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
javascript学习随笔(使用window和frame)的技巧
2007/03/08 Javascript
ImageFlow可鼠标控制图片滚动
2008/01/30 Javascript
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
js 复制或插入Html的实现方法小结
2010/05/19 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
js制作支付倒计时页面
2016/10/21 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
Vue中watch、computed、updated三者的区别及用法
2020/07/27 Javascript
Python实现简单字典树的方法
2016/04/29 Python
python format 格式化输出方法
2018/07/16 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
2019/06/25 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
Python更新所有已安装包的操作
2020/02/13 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
Data URI scheme详解和使用实例及图片base64编码实现方法
2014/05/08 HTML / CSS
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
全球知名巧克力品牌:Godiva
2016/07/22 全球购物
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
加拿大时装零售商:Influence U
2018/12/22 全球购物
公司庆典邀请函范文
2014/01/13 职场文书
高中校园广播稿
2014/10/21 职场文书
付款承诺函范文
2015/01/21 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
500字作文之关于爸爸
2019/11/14 职场文书