【问题标题】:Oracle SQL: How to convert one column of Select to rowsOracle SQL:如何将 Select 的一列转换为行
【发布时间】:2017-06-18 13:58:23
【问题描述】:

我是 Oracle 新手,正在寻找一种将 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,但不确定是否以及如何在此处应用。

有人能告诉我这是如何实现的吗?

非常感谢您的任何帮助,
迈克

【问题讨论】:

  • 你能提供样本数据和想要的结果吗?

标签: sql oracle select decode unpivot


【解决方案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;

【讨论】:

  • 谢谢,戈登。我刚刚看到我可以简单地用双管连接两列,并在它们之间添加一个换行符,然后正常选择其余的列,这在此处有效。但是,我会接受这个答案,因为它也非常有用。再次感谢。
【解决方案2】:

您正在寻找 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 IS NOT NULL 行感兴趣,则可以删除 INCLUDING NULLS。

更多详情请见the ORACLE-BASE article on PIVOT and UNPIVOT operators

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2021-12-08
    相关资源
    最近更新 更多