作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道 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
编辑:这是查询的简单(如“不深入”)解释。
length (regexp_replace(t.error, '[^,]+')) + 1
使用regexp_replace
删除除分隔符(本例中为逗号)和 length +1
之外的所有内容获取有多少元素(错误)。 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
table(cast(multiset(.....) as sys.OdciNumberList))
进行一些预言机类型的转换。
cast(multiset(.....)) as sys.OdciNumberList
将多个集合(原始数据集中的每一行一个集合)转换为单个数字集合 OdciNumberList。table()
函数将集合转换为结果集。 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
trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))
使用 column_value
作为 regexp_substr
的 nth_appearance/ocurrence 参数.t.name, t.project
)以便于可视化。对 Oracle 文档的一些引用:
关于sql - Oracle中将字符串拆分为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14328621/
我是一名优秀的程序员,十分优秀!