PL/SQL 中的表转换/字段解析
我有非规范化的表,类似于
CODES
ID | VALUE
10 | A,B,C
11 | A,B
12 | A,B,C,D,E,F
13 | R,T,D,W,W,W,W,W,S,S
The job is to conversion ,其中 VALUE 中的每个标记将生成新行。示例:
CODES_TRANS
ID | VALUE_TRANS
10 | A
10 | B
10 | C
11 | A
11 | B
在不使用自定义 pl/sql 包(最好使用纯 SQL)的情况下,在 PL/SQL 中执行此操作的最佳方法是什么?
显而易见的解决方案是通过游标来实现它。有什么想法吗?
I have de-normalized table, something like
CODES
ID | VALUE
10 | A,B,C
11 | A,B
12 | A,B,C,D,E,F
13 | R,T,D,W,W,W,W,W,S,S
The job is to convert is where each token from VALUE will generate new row. Example:
CODES_TRANS
ID | VALUE_TRANS
10 | A
10 | B
10 | C
11 | A
11 | B
What is the best way to do it in PL/SQL without usage of custom pl/sql packages, ideally with pure SQL?
Obvious solution is to implement it via cursors. Any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
另一种替代方法是使用 model 子句:
我在此博文中为此类查询编写了最多 6 个替代方法: http://rwijk.blogspot.com/2007/11/interval-based-row- Generation.html
问候,
抢。
Another alternative is to use the model clause:
I have written up to 6 alternatives for this type of query in this blogpost: http://rwijk.blogspot.com/2007/11/interval-based-row-generation.html
Regards,
Rob.
我为您提供了一个纯 SQL 解决方案。
我改编了我在 上发现的技巧一个旧的 Ask Tom 网站,由 Mihail Bratu 发布。我的改编使用正则表达式来标记 VALUE 列,因此它需要 10g 或更高。
测试数据。
查询:
I have a pure SQL solution for you.
I adapted a trick I found on an old Ask Tom site, posted by Mihail Bratu. My adaptation uses regex to tokenise the VALUE column, so it requires 10g or higher.
The test data.
The query:
根据 Celko 的书,这是我发现的并且效果很好!
其中 V_SEQ 是一个只有一个字段的静态表:
这是基于 VALUE 两端都用“,”包裹的事实,如下所示:
如果您的标记是固定长度的(就像我的情况一样),我只需使用 PLACE 字段来计算实际的字符串。如果长度可变,则使用 start_pos 和 end_pos
所以,在我的例子中,标记是 2 个字符长,所以最终的 SQL 是:
Based on Celko's book, here is what I found and it's working well!
Where V_SEQ is a static table with one field:
This is based on the fact the the VALUE is wrapped by ',' on both ends, like this:
If your tokens are fixed length (like in my case) I simply used PLACE field to calculate the actual string. If variable length, use start_pos and end_pos
So, in my case, tokens are 2 char long, so the final SQL is:
原始答案
在 SQL Server TSQL 中,我们解析字符串并创建一个表对象。这是示例代码 - 也许你可以翻译它。
http://rbgupta.blogspot.com/2007/ 10/tsql-parsing-delimited-string-into.html
第二个选项
计算每行的逗号数量。获取逗号的最大数量。假设整个表中有一行最多包含 5 个逗号。构建一个包含 5 个子字符串的 SELECT。这将使其成为基于集合的操作,并且应该比 rbar 快得多。
Original Answer
In SQL Server TSQL we parse strings and make a table object. Here is sample code - maybe you can translate it.
http://rbgupta.blogspot.com/2007/10/tsql-parsing-delimited-string-into.html
Second Option
Count the number of commas per row. Get the Max number of commas. Let's say that in the entire table you have a row with 5 commas max. Build a SELECT with 5 substrings. This will make it a set based operation and should be much faster than a rbar.