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

 更新时间:2021年07月15日 14:38:31   作者:南清风  
做多选功能时为了简便,会在某个字段中存储多个值,保存时虽然省事,但后续的查询统计时还需要拆分数据才行,因此这时需要将字段内的值分成多行以便后续使用,这篇文章主要给大家介绍了关于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'。)针对的是正则表达式里字符大小写的匹配

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

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

 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中视图的一些简单总结,希望和大家一起来学习探讨。
    2009-12-12
  • Oracle数据库启停命令示例

    Oracle数据库启停命令示例

    在windos下数据库安装过后,oracle数据库会跟随系统自启动。在linux下需要手动设置oracle启动,下面这篇文章主要给大家介绍了关于Oracle数据库启停命令的相关资料,需要的朋友可以参考下
    2023-06-06
  • Oracle安装TNS_ADMIN环境变量设置参考

    Oracle安装TNS_ADMIN环境变量设置参考

    这篇文章主要为大家介绍了Oracle安装过程中关于TNS_ADMIN环境变量设置的参考,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • Oracle中获取会话信息的两个函数分享

    Oracle中获取会话信息的两个函数分享

    这篇文章主要介绍了Oracle中获取会话信息的两个函数分享,本文分别讲解了USERENV和两个函数sys_context,并对可以获取哪些信息作了介绍,需要的朋友可以参考下
    2014-12-12
  • ORACLE出现错误1033和错误ORA-00600的解决方法

    ORACLE出现错误1033和错误ORA-00600的解决方法

    这篇文章主要介绍了ORACLE出现错误1033和错误ORA-00600的解决方法,需要的朋友可以参考下
    2014-07-07
  • Oracle字符串拆分实例详解

    Oracle字符串拆分实例详解

    这篇文章主要给大家介绍了关于Oracle字符串拆分的相关资料,Oracle提供了多种分割函数,其中最常用的是REGEXP_SUBSTR函数,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • ORACEL使用脚本来修改表结构

    ORACEL使用脚本来修改表结构

    修改表结构在某些时候还是需要用到的,下面为大家介绍下使用脚本来修改表结构,感兴趣的朋友不要错过
    2013-12-12
  • oracle连接ODBC sqlserver数据源的详细步骤

    oracle连接ODBC sqlserver数据源的详细步骤

    这篇文章主要介绍了oracle连接sqlserver数据源ODBC的详细步骤,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • oracle取数据库中最新的一条数据可能会遇到的bug(两种情况)

    oracle取数据库中最新的一条数据可能会遇到的bug(两种情况)

    这篇文章主要介绍了oracle取数据库中最新的一条数据可能会遇到的bug,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Oracle 阻塞(blocking blocked)介绍和实例演示

    Oracle 阻塞(blocking blocked)介绍和实例演示

    这篇文章主要介绍了Oracle 阻塞(blocking blocked)介绍和实例演示,如何定位当前系统有哪些阻塞,到底谁是阻塞者,谁是被阻塞者,本文对此给出了描述并做了相关演示,需要的朋友可以参考下
    2014-09-09

最新评论