将一行拆分为多行(固定宽度)
Posted
技术标签:
【中文标题】将一行拆分为多行(固定宽度)【英文标题】:Split one row into multiple rows (fixed width) 【发布时间】:2011-10-27 17:31:48 【问题描述】:一行传入记录有多个连接的子记录。每个子记录长 9 个字符。我在每一行中有 8 个这样的子记录。所以每一行都是(8x9=72 char)。有没有办法可以在这里将 1 条记录拆分为 8 条记录?
输入
123456789123456789123456789123456789123456789123456789123456789123456789
输出
123456789
123456789
123456789
123456789
123456789
123456789
123456789
123456789
我知道我可以用 8 个子查询来做到这一点并将它们合并.. 有更好的方法吗?
【问题讨论】:
如果你需要一个真正的分割oracle函数,也许你可以访问这个链接:Oracle split问候 【参考方案1】:或者这个怎么样:
SELECT substr(t1.astr,n*9+1,9)
FROM t1,
(SELECT ROWNUM-1 n FROM dual CONNECT BY LEVEL <= 8) t2
表 t1 包含您的字符串,表 t2 是生成的从 0 到 7 的序列号列表,通过将其交叉连接到 t1 表,我们可以使用它来分割字符串列。
【讨论】:
在迭代器上比我的解决方案好得多。 substr 需要稍微改变一下。以下内容经过测试和工作:select t2.n, substr('123456789123456789123456789123456789123456789123456789123456789123456789',n*9+1,9) from dual, (SELECT ROWNUM-1 n FROM dual CONNECT BYpan> t 干杯哥们,发现得很好,已经更正了,(我是时候在我的 linux 服务器上安装 oracle 了) 对如何在 mysql 中执行此操作有任何想法吗? 是的,您可以将 t2 视为可能包含序列号的表的交叉连接?【参考方案2】:我看到人们使用仅包含值 1 到 8 的辅助表,然后加入该表。您可以使用该值对您的记录进行子串化。
有点像
SELECT SUBSTRING(long_val, eight.value * 9, 9)
FROM mytable, eight
注意:查询未经测试,但我希望这个想法得到传达。
【讨论】:
这是个好主意,也许您可以使用 ALL_OBJECTS 视图生成必要的行数(通过使用 rownum 并定义创建所需行数的逻辑)【参考方案3】:如果可以预测每行将始终分成固定数量的行,则应该可以执行以下操作:
select
b.iterator,
substr(a.mystring,b.iterator*9-8,9) as split
from
(select '123456789123456789123456789123456789123456789123456789123456789123456789' as mystring from dual) a,
(select 1 as iterator from dual union
select 2 as iterator from dual union
select 3 as iterator from dual union
select 4 as iterator from dual union
select 5 as iterator from dual union
select 6 as iterator from dual union
select 7 as iterator from dual union
select 8 as iterator from dual) b
编辑:Kevin 的迭代器比我的蛮力版本更简单、更好。 b 子查询应该是 (SELECT ROWNUM as iterator FROM dual CONNECT BY LEVEL
【讨论】:
以上是关于将一行拆分为多行(固定宽度)的主要内容,如果未能解决你的问题,请参考以下文章