将一行拆分为多行

时间:2011-10-27 17:31:49

标签: sql oracle plsql oracle10g

一行传入记录连接了多个子记录。每个子记录长度为9个字符。我每行有8个这样的子记录。所以每行都是(8x9 = 72个字符)。有没有办法可以将1条记录分成8条记录?

输入

123456789123456789123456789123456789123456789123456789123456789123456789

输出

123456789

123456789

123456789

123456789

123456789

123456789

123456789

123456789

我知道我可以通过8个子查询来实现这一点并将它们联合起来..有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

或者如何:

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表我们可以用它来剪切字符串列。

答案 1 :(得分:1)

我看到人们使用仅包含值1到8的辅助表,然后加入该表。您可以使用该值来对记录进行子串。

这样的东西
SELECT SUBSTRING(long_val, eight.value * 9, 9)
FROM mytable, eight

注意:查询未经测试,但我希望这个想法得以实现。

答案 2 :(得分:1)

如果可以预测每一行总是会分成固定数量的行,那么应该可能出现以下情况:

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
编辑:凯文的迭代器比我的暴力版本更简单,更好。 b子查询应该是(SELECT ROWNUM as iterator FROM dual CONNECT BY LEVEL&lt; = 8)