oracle中将一行字符串拆分成多行

--创建测试数据

create table bk_tesk(id varchar2(10),s varchar2(20));

insert into bk_tesk values ('A','1,2,3');
insert into bk_tesk values ('B','4,5,6');
insert into bk_tesk values ('C','7,8');

 

--查询语句

select * from   bk_tesk;

 

我们需要将字段S中以逗号分隔的数据拆分成多行。结果如图所示

 

 

实现将一行数据拆分成多行的代码如下所示

 

select id, trim(regexp_substr(s, '[^,]+', 1, level)) as s
from bk_tesk
connect by prior sys_guid() is not null
and level <= regexp_count(s, ',') + 1
and prior id = id
order by id, s;

 

1: PRIOR id = id这个条件的主要作用是确保层次查询在处理每个id 时保持连续性

  • PRIOR 关键字用于引用上一行的值。
  • 这个条件使得每次迭代都使用相同的 id 值。
  • 它防止查询跨越不同的 id 值,确保每个 id 的所有拆分值都被正确处理。
  • 例如,当处理 'a' 的值时,这个条件确保不会跳到 'b' 的值,直到 'a' 的所有值都被处理完。
  • id字段必须是唯一值,不然查询结果会出现重复值。如果id不是唯一,可以使用rowid(PRIOR rowid = rowid)

2: PRIOR SYS_GUID() IS NOT NULL。这个条件的主要目的是为了创建一个始终为真的条件。允许 CONNECT BY 继续执行,

直到其他条件(如 LEVEL 条件)停止查询

 
 
分类: Oracle
 

 

posted @   Iven_lin  阅读(251)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示