2016-12-06 83 views
0

我需要关于如何实现以下内容的建议。Oracle根据列值将行拆分为多行

我有类似这样的一个表:

WITH CTE (slno, column1, column2, column3, slno2, column4, column5, column6, column7, column8, column9, column10, column11) AS (
    SELECT 10000, 'a', 'aa', ';', 10000, 'aaa', 'aaaa', 'aaaaa','aaaaaa', ';', 'aaaaa2', 'aaaaa12', 'aaaa22' FROM DUAL UNION 
    SELECT 10001, 'b', 'bb', ';', 10001, 'bbb', 'bbbb', 'bbbb', 'bbbbbb', ';', 'bbbbb2', 'bbbbb12', 'bbb22' FROM DUAL UNION 
    SELECT 10001, 'c', 'cc', ';', 10001, 'ccc', 'cccc', 'cccc', 'cccccc', ';', 'ccccc2', 'ccccc12', 'ccc22' FROM DUAL 
) 

表看起来像

SLNO COLUMN1 COLUMN2 COLUMN3 SLNO2 COLUMN4 COLUMN5 COLUMN6 COLUMN7 COLUMN8 COLUMN9 COLUMN10 COLUMN11 
10000 a aa ; 10000 aaa aaaa aaaaa aaaaaa ; aaaaa2 aaaaa12 aaaa22 
10002 b bb ; 10002 bbb bbbb bbbb bbbbbb ; bbbbb2 bbbbb12 bbb22 
10003 c cc ; 10003 ccc cccc cccc cccccc ; ccccc2 ccccc12 ccc22 

我需要每行此表分割和分割应在第3和发生8(人为添加分隔符)

最后,输出应该看起来像:

Column Column Column Column Column Column 
10000 a aa ;  
10000 aaa aaaa aaaaa aaaaaa ; 
aaaaa2 aaaaa12 aaaa22   
10001 b bb ;  
10001 bbb bbbb bbbb bbbbbb ; 
bbbbb2 bbbbb12 bbb22   
10001 c cc ;  
10001 ccc cccc cccc cccccc ; 
ccccc2 ccccc12 ccc22 

将分号添加到具有分隔符和标记的行应分开。 任何想法?

+0

第3列8是静态的? –

+0

是的,它们是静态的 –

回答

0
select slno c1, column1 c2, column2 c3, ';' c4, null c5, null c6 from table 
union all 
select column4 c1, column5 c2, column6 c3, column7 c4, column8 c5, ';' c6 from table 
union all 
select column9 c1, column10 c2, column11 c3, ';' c4, null c5, null c6 from table; 

如果你需要这个命令你可以有:

select c1, c2, c3, c4, c5, c6 from 
( select slno c1, column1 c2, column2 c3, ';' c4, null c5, null c6, rowid r from table 
    union all 
    select column4 c1, column5 c2, column6 c3, column7 c4, column8 c5, ';' c6, rowid r from table 
    union all 
    select column9 c1, column10 c2, column11 c3, ';' c4, null c5, null c6, rowid r from table) 
order by r 

编辑

如果这仅仅是用于出口,我会去为:

select slno || ',' || column1 || ',' || column2 || ',' || ';' linerow from table 
union all 
select column4 || ',' || column5 || ',' || column6 || ',' || column7 c4 || ',' || column8 c5 || ',' || ';' linerow from table 
union all 
select column9 || ',' || column10 || ',' || column11 || ',' || ';' linerow from table; 
+0

它不是答案 –

+0

是否有可能避免空值?这将在稍后以CSV格式导出,而那些空格将出现 –

+0

@ZacksiZacksiev由于一致性而出现空值。一个查询有5-6列其他3-4个。如果你想避免空值,你可以导出3列5列的separatel; y子查询。 – Kacper