Sql 将分隔表拆分为行

Sql 将分隔表拆分为行,sql,oracle,plsql,delimiter,Sql,Oracle,Plsql,Delimiter,我得到了一些与此非常相似的数据: ID STATUS EMPL 1 Created;Solved;Closed John;Terry;Martin 当然,每行中的值的数量可以从1到n不等。我发现了一些关于这方面的建议,仅使用带有regexp\u substr的Connect by的1列 是否有任何SQL或PL/SQL方式可以获得所需的输出: ID STATUS EMPL 1 Created John 1 Solved Terry

我得到了一些与此非常相似的数据:

ID  STATUS                  EMPL
1   Created;Solved;Closed   John;Terry;Martin
当然,每行中的值的数量可以从1到n不等。我发现了一些关于这方面的建议,仅使用带有regexp\u substr的Connect by的1列

是否有任何SQL或PL/SQL方式可以获得所需的输出:

ID  STATUS   EMPL
1   Created  John
1   Solved   Terry
1   Closed   Martin

谢谢

我不确定在大桌子上的性能,但是这个选择应该有效

select st.id, st.status, em.empl from (
    select distinct id, level as lvl, regexp_substr(status,'[^;]+',1,level) as status 
    from to_split connect by regexp_substr(status,'[^;]+',1,level) is not null
) st
join (
    select distinct id, level as lvl, regexp_substr(empl,'[^;]+',1,level) as empl 
    from to_split connect by regexp_substr(empl,'[^;]+',1,level) is not null
) em
on st.id = em.id and st.lvl = em.lvl
order by id;

不确定在大表上的性能,但此选择应该可以工作

select st.id, st.status, em.empl from (
    select distinct id, level as lvl, regexp_substr(status,'[^;]+',1,level) as status 
    from to_split connect by regexp_substr(status,'[^;]+',1,level) is not null
) st
join (
    select distinct id, level as lvl, regexp_substr(empl,'[^;]+',1,level) as empl 
    from to_split connect by regexp_substr(empl,'[^;]+',1,level) is not null
) em
on st.id = em.id and st.lvl = em.lvl
order by id;

编写一个函数或SP。在其中放置一个光标,并循环遍历每一行。在每行上,使用拆分数据;如问题所示。现在有一个临时表并继续添加。这将更容易在应用层处理,例如Java。数据库不是清理数据的最佳场所。首先,规范化或至少使用集合类型。使用CSV是一个非常糟糕的主意。@TimBiegeleisen-我意识到这并不理想,但我工作的公司就是这样做的-我做不了多少…我同意@TimBiegeleisen,拥有前端代码会很好。如果您有任何阻碍您的策略,请使用SQL选项。编写一个函数或SP。在其中有一个游标,并循环每一行。在每行上,使用拆分数据;如问题所示。现在有一个临时表并继续添加。这将更容易在应用层处理,例如Java。数据库不是清理数据的最佳场所。首先,规范化或至少使用集合类型。使用CSV是一个非常糟糕的主意。@TimBiegeleisen-我意识到这并不理想,但我工作的公司就是这样做的-我做不了多少…我同意@TimBiegeleisen,拥有前端代码会很好。如果您有任何阻碍您的策略,请使用SQL选项。