oralce中根据某个字段中字符串,把一条数据分解为多条

时间:2021-12-04 14:48:00
oralce中根据某个字段中字符串,把一条数据分解为多条

上面是一条出差记录,根据其中的第4个字段(代表随行人员的编号),将一条出差记录分解为多条出差记录。该如何做?

11 个解决方案

#1


http://bbs.csdn.net/topics/391905700
参考版主答案

#2


oralce中根据某个字段中字符串,把一条数据分解为多条

#3


你是哪个版本的库?

#4


引用 3 楼 wmxcn2000 的回复:
你是哪个版本的库?
 11g

#5


with t as(select '1' id,'11,22,33' str from dual union all select '2','11,22,33,44' from dual)

select id,regexp_substr(str,'[^,]+',1,level) str
  from t
 connect by level<=regexp_count(str,'[^,]+')
        and prior id=id
        and prior dbms_random.random is not null

#6


with t1 as
 (
      select 'a,b,c' c1 from dual
 )
  
 select distinct regexp_substr(c1, '[^,]+',1,level) c1
 from t1
 connect by level <= length(c1) - length(replace(c1,',','')) + 1;

#7


引用 5 楼 z123zjf 的回复:
with t as(select '1' id,'11,22,33' str from dual union all select '2','11,22,33,44' from dual)

select id,regexp_substr(str,'[^,]+',1,level) str
  from t
 connect by level<=regexp_count(str,'[^,]+')
        and prior id=id
        and prior dbms_random.random is not null
还有自身的那一条也需要包含进来 ,也就是你这里的 '1' id,'11,22,33' str,该怎么改

#8


引用 7 楼 abc8023 的回复:
Quote: 引用 5 楼 z123zjf 的回复:

with t as(select '1' id,'11,22,33' str from dual union all select '2','11,22,33,44' from dual)

select id,regexp_substr(str,'[^,]+',1,level) str
  from t
 connect by level<=regexp_count(str,'[^,]+')
        and prior id=id
        and prior dbms_random.random is not null
还有自身的那一条也需要包含进来 ,也就是你这里的 '1' id,'11,22,33' str,该怎么改

加个  union  呢?

#9


引用 7 楼 abc8023 的回复:
Quote: 引用 5 楼 z123zjf 的回复:

with t as(select '1' id,'11,22,33' str from dual union all select '2','11,22,33,44' from dual)

select id,regexp_substr(str,'[^,]+',1,level) str
  from t
 connect by level<=regexp_count(str,'[^,]+')
        and prior id=id
        and prior dbms_random.random is not null
还有自身的那一条也需要包含进来 ,也就是你这里的 '1' id,'11,22,33' str,该怎么改


自身那一条?
像这样  '出差领导','随行人1,随行人2,...'这样?
可以字符串合并   出差领导||','||'1,2,3'
id||','||str

#10


引用 9 楼 z123zjf 的回复:
Quote: 引用 7 楼 abc8023 的回复:

Quote: 引用 5 楼 z123zjf 的回复:

with t as(select '1' id,'11,22,33' str from dual union all select '2','11,22,33,44' from dual)

select id,regexp_substr(str,'[^,]+',1,level) str
  from t
 connect by level<=regexp_count(str,'[^,]+')
        and prior id=id
        and prior dbms_random.random is not null
还有自身的那一条也需要包含进来 ,也就是你这里的 '1' id,'11,22,33' str,该怎么改


自身那一条?
像这样  '出差领导','随行人1,随行人2,...'这样?
可以字符串合并   出差领导||','||'1,2,3'
id||','||str
  恩 ok了 但是我查询时需要dblink,此时dbms_random处报错了:无效SQL

#11


试试将dbms_random.random替换成sys_guid()

#1


http://bbs.csdn.net/topics/391905700
参考版主答案

#2


oralce中根据某个字段中字符串,把一条数据分解为多条

#3


你是哪个版本的库?

#4


引用 3 楼 wmxcn2000 的回复:
你是哪个版本的库?
 11g

#5


with t as(select '1' id,'11,22,33' str from dual union all select '2','11,22,33,44' from dual)

select id,regexp_substr(str,'[^,]+',1,level) str
  from t
 connect by level<=regexp_count(str,'[^,]+')
        and prior id=id
        and prior dbms_random.random is not null

#6


with t1 as
 (
      select 'a,b,c' c1 from dual
 )
  
 select distinct regexp_substr(c1, '[^,]+',1,level) c1
 from t1
 connect by level <= length(c1) - length(replace(c1,',','')) + 1;

#7


引用 5 楼 z123zjf 的回复:
with t as(select '1' id,'11,22,33' str from dual union all select '2','11,22,33,44' from dual)

select id,regexp_substr(str,'[^,]+',1,level) str
  from t
 connect by level<=regexp_count(str,'[^,]+')
        and prior id=id
        and prior dbms_random.random is not null
还有自身的那一条也需要包含进来 ,也就是你这里的 '1' id,'11,22,33' str,该怎么改

#8


引用 7 楼 abc8023 的回复:
Quote: 引用 5 楼 z123zjf 的回复:

with t as(select '1' id,'11,22,33' str from dual union all select '2','11,22,33,44' from dual)

select id,regexp_substr(str,'[^,]+',1,level) str
  from t
 connect by level<=regexp_count(str,'[^,]+')
        and prior id=id
        and prior dbms_random.random is not null
还有自身的那一条也需要包含进来 ,也就是你这里的 '1' id,'11,22,33' str,该怎么改

加个  union  呢?

#9


引用 7 楼 abc8023 的回复:
Quote: 引用 5 楼 z123zjf 的回复:

with t as(select '1' id,'11,22,33' str from dual union all select '2','11,22,33,44' from dual)

select id,regexp_substr(str,'[^,]+',1,level) str
  from t
 connect by level<=regexp_count(str,'[^,]+')
        and prior id=id
        and prior dbms_random.random is not null
还有自身的那一条也需要包含进来 ,也就是你这里的 '1' id,'11,22,33' str,该怎么改


自身那一条?
像这样  '出差领导','随行人1,随行人2,...'这样?
可以字符串合并   出差领导||','||'1,2,3'
id||','||str

#10


引用 9 楼 z123zjf 的回复:
Quote: 引用 7 楼 abc8023 的回复:

Quote: 引用 5 楼 z123zjf 的回复:

with t as(select '1' id,'11,22,33' str from dual union all select '2','11,22,33,44' from dual)

select id,regexp_substr(str,'[^,]+',1,level) str
  from t
 connect by level<=regexp_count(str,'[^,]+')
        and prior id=id
        and prior dbms_random.random is not null
还有自身的那一条也需要包含进来 ,也就是你这里的 '1' id,'11,22,33' str,该怎么改


自身那一条?
像这样  '出差领导','随行人1,随行人2,...'这样?
可以字符串合并   出差领导||','||'1,2,3'
id||','||str
  恩 ok了 但是我查询时需要dblink,此时dbms_random处报错了:无效SQL

#11


试试将dbms_random.random替换成sys_guid()