将一行拆分为多行(固定宽度)

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

【讨论】:

以上是关于将一行拆分为多行(固定宽度)的主要内容,如果未能解决你的问题,请参考以下文章

在同一个数据库表中将一行拆分为多行

将一行拆分为多行pyspark

根据列值将一行拆分为多行

sql一行拆分多行记录

sql如何把行拆分为几行

通过解析列中的字符串值将表中的一行拆分为多行