2017-06-18 151 views
0

我是Oracle新手,正在寻找将Select中的1列转换为行的方法。Oracle SQL:如何将Select列转换为行

我的第一种方法是使用Listagg,它完全符合我的要求,但字符数限制对于我的情况来说还不够。 作为替代方案,我想要做以下事情。

SELECT 
    t.col1 
    , t.col2 
    , t.col3 
    , t.col4 
    , t.col5 
FROM 
    my table t 

代替t.col1 t.col2 t.col3 t.col4 t.col5标准输出的予想t.col2出现在的行(即低于彼此)代替在列(彼此相邻)。 Col2始终包含一个值,每个值都应显示在单独的行中。

在寻找解决方案时,我遇到了Unpivot和Decode,但不确定是否以及如何在此处应用此方法。

有人可以告诉我这可以实现吗?

提前为任何帮助非常感谢,
迈克

+1

您能提供样本数据和期望的结果吗? –

回答

1

一个简单的方法 - 如果你的数据不是太大 - 只是使用union all。您的描述使得它听起来像你想的:

select col1, col2, col5 
from t 
where col2 is not null 
union all 
select col1, col3, col5 
from t 
where col2 is not null 
union all 
select col1, col4, col5 
from t 
where col2 is not null; 

嗯,或者如果你只是想在col2不同值:

select distinct col2 
from t; 
+0

谢谢,戈登。我刚才看到,我可以简单地用两个管道连接两列,并在它们之间添加一个换行符,并选择其余的正常工作。但是,我会接受这个答案,因为它也非常有用。再次感谢。 – keewee279

0

您正在寻找UNPIVOT功能

SELECT col 
FROM my table t 
UNPIVOT INCLUDE NULLS (col FOR source_column_name IN (col1, col2, col3, col4, col5) 

COL 
---- 
Value 1 
Value 2 
Value 3 
Value 4 
Value 5 

结果包含五行,每行COL一列,其中包含COL1至COL5列的值。 (未使用)列SOURCE_COLUMN_NAME包含数据来自的列的名称。如果您只对COL不为NULL的行感兴趣,则可以删除INCLUDING NULLS。

请参阅the ORACLE-BASE article on PIVOT and UNPIVOT operators了解更多详情。