1

我在一个表中有 50 列,它只返回一行,我希望一行 50 列显示在 50 行和一列中。

有人可以建议我使用 Oracle 查询吗?

4

2 回答 2

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 |
| (空) |
|..........|

如果您需要具有来自透视表的列名的列,只需放弃外部选择

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

样本输出:

| 科尔斯 | COLVALUE |
--------------------
| COL1 | 1 |
| COL2 | 2 |
| COL3 | (空) |
| ……|…………|

这是SQLFiddle演示

于 2013-06-21T03:30:00.390 回答
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

于 2013-06-21T03:05:29.027 回答