--创建测试数据
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 条件)停止查询
标签:多行,tesk,PRIOR,bk,字符串,oracle,查询,id From: https://www.cnblogs.com/ivenlin/p/18640056