首页 >数据库 >mysql教程 >如何在 Oracle 中将逗号分隔的字符串拆分为多行?

如何在 Oracle 中将逗号分隔的字符串拆分为多行?

Susan Sarandon
Susan Sarandon原创
2025-01-22 17:51:12562浏览

How to Split Comma-Separated Strings into Multiple Rows in Oracle?

在 Oracle 中拆分逗号分隔的字符串到多行

在 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>

说明:

  1. 创建临时表: 创建 TEMP 表以存储示例数据。
  2. 使用分层查询: 子查询 select level from dual connect by level <= regexp_count(t.error, ',') 生成一个数字序列,其长度等于字符串中逗号的数量加一(即错误的数量)。
  3. 强制类型转换和表: table()cast() 函数将分层查询转换为数字列表集合,然后将其转换为表。这将产生具有递增数字的行,对应于 TEMP 表中的每一行。
  4. 提取错误值: regexp_substr() 函数用于根据上一步中的数字提取单个错误值。trim() 函数删除任何前导或尾随空格。
  5. 连接和选择: 主查询将 TEMP 表与步骤 4 中创建的表连接,并选择相应的列:名称、项目和错误。

注意: 此解决方案使用 OdciNumberList 类型,如果使用早于 12c 的 Oracle 版本,可能需要指定兼容性设置。

以上是如何在 Oracle 中将逗号分隔的字符串拆分为多行?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn