Oracle查询将多列转换为一列

时间:2013-06-21 02:53:10

标签: oracle

我在一个表中有50列,它只返回一行,我想要一行50列一行显示。

任何人都可以建议我查询Oracle吗?

2 个答案:

答案 0 :(得分:4)

您可以将UNPIVOT用于这样的一行,只获取值为

的列
SELECT colvalue 
  FROM
(
  SELECT * 
    FROM Table1
  UNPIVOT INCLUDE NULLS
  (
    colvalue FOR cols IN (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, ... col50)
  )
);

示例输出:

| COLVALUE |
------------
|        1 |
|        2 |
|   (null) |
|..........|

如果您需要带有旋转表中列名的列,则只需抛弃外部选择

SELECT * 
  FROM Table1
UNPIVOT INCLUDE NULLS
(
  colvalue FOR cols IN (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, ... col50)
);

示例输出:

|  COLS | COLVALUE |
--------------------
|  COL1 |        1 |
|  COL2 |        2 |
|  COL3 |   (null) |
| ..... |......... |

这是 SQLFiddle 演示

答案 1 :(得分:0)

准备进行大量输入:) Oracle具有UNPIVOT功能,但它希望结果中至少有两列,因此它不适用于您的情况。

首先,您需要一个从1到50的计数器。您可以像这样查询一个:

SELECT LEVEL as Counter FROM DUAL CONNECT BY LEVEL <= 50

如果您执行此查询,您将获得数字1-50作为结果。以此为基础,这是完整的(ish)查询:

WITH Cols AS (
  SELECT LEVEL as Counter
  FROM DUAL
  CONNECT BY LEVEL <= 50
)
SELECT
  CASE Cols.Counter
    WHEN 1 THEN Col1
    WHEN 2 THEN Col2
    WHEN 3 THEN Col3
    . . .
    WHEN 50 THEN Col50
  END AS myColumn
FROM myTable
CROSS JOIN Cols
ORDER BY Cols.Counter

请注意,所有列必须是相同的数据类型,因此如果您混合使用字符,数字和日期,则需要将它们全部转换为字符。

请注意,此查询假定表中的一行行,如问题中所述。如果有多行,则应以ORDER BY a-column-that-identifies-the-row, Cols.Counter结束。