gpt4 book ai didi

sql - Oracle中将字符串拆分为多行

转载 作者:行者123 更新时间:2023-12-03 04:51:38 26 4
gpt4 key购买 nike

我知道 PHP 和 MYSQL 在某种程度上已经回答了这个问题,但我想知道是否有人可以教我在 Oracle 10g(最好)和 11g 中将字符串(逗号分隔)拆分为多行的最简单方法。

表格如下:

Name | Project | Error 
108 test Err1, Err2, Err3
109 test2 Err1

我想创建以下内容:

Name | Project | Error
108 Test Err1
108 Test Err2
108 Test Err3
109 Test2 Err1

我已经看到了一些关于堆栈的潜在解决方案,但是它们只占单个列(即逗号分隔的字符串)。任何帮助将不胜感激。

最佳答案

这可能是一种改进的方式(也可以使用正则表达式和连接方式):

with temp as
(
select 108 Name, 'test' Project, 'Err1, Err2, Err3' Error from dual
union all
select 109, 'test2', 'Err1' from dual
)
select distinct
t.name, t.project,
trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value)) as error
from
temp t,
table(cast(multiset(select level from dual connect by level <= length (regexp_replace(t.error, '[^,]+')) + 1) as sys.OdciNumberList)) levels
order by name

编辑:这是查询的简单(如“不深入”)解释。

  1. length (regexp_replace(t.error, '[^,]+')) + 1使用regexp_replace删除除分隔符(本例中为逗号)和 length +1 之外的所有内容获取有多少元素(错误)。
  2. select level from dual connect by level <= (...)使用分层查询创建一个列,其中找到的匹配项数量不断增加,从 1 到错误总数。

    预览:

    select level, length (regexp_replace('Err1, Err2, Err3', '[^,]+'))  + 1 as max 
    from dual connect by level <= length (regexp_replace('Err1, Err2, Err3', '[^,]+')) + 1
  3. table(cast(multiset(.....) as sys.OdciNumberList))进行一些预言机类型的转换。
    • cast(multiset(.....)) as sys.OdciNumberList将多个集合(原始数据集中的每一行一个集合)转换为单个数字集合 OdciNumberList。
    • table()函数将集合转换为结果集。
  4. FROM如果没有连接,则会在数据集和多重集之间创建交叉连接。因此,数据集中具有 4 个匹配项的行将重复 4 次(名为“column_value”的列中的数字不断增加)。

    预览:

    select * from 
    temp t,
    table(cast(multiset(select level from dual connect by level <= length (regexp_replace(t.error, '[^,]+')) + 1) as sys.OdciNumberList)) levels
  5. trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))使用 column_value作为 regexp_substrnth_appearance/ocurrence 参数.
  6. 您可以从数据集中添加一些其他列(例如 t.name, t.project)以便于可视化。

对 Oracle 文档的一些引用:

关于sql - Oracle中将字符串拆分为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14328621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com