Oracle SQL生成每个行ID的组合

22 浏览
0 Comments

Oracle SQL生成每个行ID的组合

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

表格如下:

姓名 | 项目 | 错误

108 测试 错误1,错误2,错误3

109 测试2 错误1

我想创建以下内容:

姓名 | 项目 | 错误
108    测试      错误1
108    测试      错误2 
108    测试      错误3 
109    测试2     错误1

我在stack上看到了一些潜在的解决方案,但它们只考虑了单个列(即逗号分隔的字符串)。非常感谢任何帮助。

0
0 Comments

Oracle SQL生成每个行ID的组合的原因是,需要将一个包含多个分隔字符串的字段拆分成多行。如果不对行进行限制,使用CONNECT BY子句会产生多行,并且不能得到期望的输出。

解决方法有几种,除了正则表达式外,还可以使用XMLTable或MODEL子句。

使用XMLTable的解决方法是,将字段中的逗号替换为双引号,并使用XMLTable函数将其拆分为多行。

使用MODEL子句的解决方法是,通过创建一个包含相关参数的公共表达式,并使用MODEL子句的规则迭代来拆分字段,并将结果输出为多行。

在使用XMLTable时,需要使用('" ' || REPLACE(text, ',', '","') || '"')的表达式,以确保输出正确。这是一个XQuery表达式,Oracle文档对此并不清楚。

另外,使用XMLTable的解决方法在某些情况下无法正确输出最后一个单词。这可能是由于行的长度不同造成的。解决方法是对结果进行排序。

0
0 Comments

问题的出现原因是在查询中没有使用distinct关键字,导致结果出现重复的行。

解决方法是在查询中添加distinct关键字,以去除重复的行。

0
0 Comments

问题的出现原因:

这个问题出现的原因是因为需要对每个行id生成组合,但是原始的数据集并没有给出需要组合的元素。因此,需要使用Oracle SQL来处理这个问题。

解决方法:

为了解决这个问题,可以使用正则表达式和连接查询的方式来生成组合。首先,使用正则表达式的函数regexp_replace将非分隔符(逗号)的部分替换为空字符串,并计算出剩余字符串的长度,即元素(错误)的数量。然后,使用连接查询和层次查询的方式创建一个包含从1到错误总数的递增匹配数的列。接下来,将多个集合转换为一个单一的数字集合,并将其转换为结果集。最后,使用regexp_substr函数和column_value作为参数来提取错误的第n次出现。

以上就是解决这个问题的方法和步骤。这个方法在性能上有所提升,并且可以根据需要添加其他列来实现可视化。

文章链接:

[Oracle SQL生成每行id的组合](https://stackoverflow.com/questions/31464275/31464699#31464699)

参考文档:

- [REGEXP_REPLACE函数](https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm)

- [REGEXP_SUBSTR函数](https://docs.oracle.com/cd/B12037_01/server.101/b10759/functions116.htm)

- [扩展性常量、类型和映射(OdciNumberList)](https://docs.oracle.com/cd/B19306_01/appdev.102/b14289/dcicnstnts.htm#sthref951)

- [CAST函数](https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions016.htm)

- [层次查询](https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm)

注意事项:

使用正则表达式的格式'[^,]+'来解析字符串时,如果列表中存在空元素,则无法返回正确的项。有关更多信息,请参考链接。

另外,从Oracle 11g版本开始,可以使用regexp_count(t.error, ',')来代替length (regexp_replace(t.error, '[^,]+')),这可能会带来更好的性能。

最后,这种方法的性能远远优于常规的CONNECT BY方法,可以大大减少查询的执行时间。

0