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
本文来自博客园,作者:Iven_lin,转载请注明原文链接:https://www.cnblogs.com/ivenlin/p/18640056
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库