在 Oracle 中,您可以结合使用正则表达式和分层查询将逗号分隔的字符串拆分为多行。以下是如何实现此目标的完整指南:
问题陈述:
假设有一个表具有以下结构:
<code>名称 | 项目 | 错误 -------------- 108 | test | Err1, Err2, Err3 109 | test2 | Err1</code>
您希望将“错误”列转换为多行,结果如下:
<code>名称 | 项目 | 错误 -------------- 108 | test | Err1 108 | test | Err2 108 | test | Err3 109 | test2 | Err1</code>
解决方案:
<code class="language-sql">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 <= regexp_count(t.error, ',')) as OdciNumberList)) levels ;</code>
说明:
select level from dual connect by level <= regexp_count(t.error, ',')
生成一个数字序列,其长度等于字符串中逗号的数量加一(即错误的数量)。table()
和 cast()
函数将分层查询转换为数字列表集合,然后将其转换为表。这将产生具有递增数字的行,对应于 TEMP 表中的每一行。regexp_substr()
函数用于根据上一步中的数字提取单个错误值。trim()
函数删除任何前导或尾随空格。注意: 此解决方案使用 OdciNumberList 类型,如果使用早于 12c 的 Oracle 版本,可能需要指定兼容性设置。
以上是如何在 Oracle 中将逗号分隔的字符串拆分为多行?的详细内容。更多信息请关注PHP中文网其他相关文章!