如何在 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 中取消透视单行?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 11g 透视查询优化 - 多行到单行

取消透视表 Oracle 中的数据

Oracle 11g:取消透视多个列并包含列名

取消透视到 Oracle 中的多个列

如何取消透视多列数据?

如何取消透视以下列?