Oracle SQL:如何将 Select 的一列转换为行

Oracle SQL: How to convert one column of Select to rows

我是 Oracle 的新手,正在寻找一种将 Select 中的 1 列转换为行的方法。

我的第一种方法是使用 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,但不确定是否以及如何在此处应用。

谁能告诉我这是如何实现的?

非常感谢您的帮助,
麦克

一个简单的方法——如果你的数据不是太大——就是使用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;

您正在寻找 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