如何在 Oracle 11 中取消透视单行?
Posted
技术标签:
【中文标题】如何在 Oracle 11 中取消透视单行?【英文标题】:How to unpivot a single row in Oracle 11? 【发布时间】:2019-09-04 13:37:12 【问题描述】:我有一行数据,我想把这一行变成一列,这样我就可以使用游标一个一个地遍历数据。我尝试过使用
SELECT * FROM TABLE(PIVOT(TEMPROW))
但我明白了
'PIVOT' 标识符无效错误。
我也尝试过相同的语法,但使用了
('select * from TEMPROW')
我看到的所有使用 pivot 的东西总是使用 count 或 sum,但我只想让所有 varchar2 的这一行变成一列。
我的行看起来像这样:
ABC | 123 |啊! bbb | 111 | 222 |
我需要它变成这样:
ABC
123
啊啊
bbb
111
222
我的代码是这样的:
BEGIN
OPEN C_1 FOR SELECT * FROM TABLE(PIVOT( 'SELECT * FROM TEMPROW'));
LOOP
FETCH C_1 INTO TEMPDATA;
EXIT WHEN C_2%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(1);
END LOOP;
CLOSE C_1;
END;
【问题讨论】:
见Why should I provide a Minimal Reproducible Example for a very simple SQL query? 【参考方案1】:您必须取消透视才能将整行转换为 1 列
select * from Table
UNPIVOT
(col for col in (
'ABC' , '123' , 'aaa' ,' bbb' , '111' , '222'
))
或使用联合,但为此您需要手动添加列名称
Select * from ( Select col1 from table
union
select col2 from table union...
Select coln from table)
示例输出如下所示
【讨论】:
我是否需要每次都列出确切的值?因为它们是根据我给出的参数在运行时生成的。但是,我确实知道列名,这行得通吗? 然后你可以在 unpivot 之后选择 * pivot 和 unpivot 都显示为黑色,就好像它们是变量一样,这让我相信我的 Oracle 不支持它们。我正在运行 Oracle 11.2。 然后你必须使用 union 但这将是手动的,例如 select col1 from table union select col2 from table..... Union select coln from table【参考方案2】:unpivoting
的一个选项是按decode()
和cross join
对列进行编号,查询包含列号:
select decode(myId, 1, col1,
2, col2,
3, col3,
4, col4,
5, col5,
6, col6 ) as result_col
from temprow
cross join (select level AS myId FROM dual CONNECT BY level <= 6 );
或者使用带有unpivot
关键字的查询,考虑到列的通用表达式(在这种情况下即col
)必须具有与相应表达式相同的数据类型:
select result_col from
(
select col1, to_char(col2) as col2, col3, col4,
to_char(col5) as col5, to_char(col6) as col6
from temprow
)
unpivot (result_col for col in (col1,col2,col3,col4,col5,col6));
Demo
【讨论】:
我猜联合比交叉连接好得多,但无论哪种方式都是正确的 好吧,看来您需要将列转换为数字类型列的字符串类型:),顺便说一句,我讨厌过多的union
@HimanshuAhuja
是的,在数字的情况下需要强制转换,尽管这是我发布的示例。没关系,OP 已将您的帖子标记为答案 :)以上是关于如何在 Oracle 11 中取消透视单行?的主要内容,如果未能解决你的问题,请参考以下文章