我在一个表中有 50 列,它只返回一行,我希望一行 50 列显示在 50 行和一列中。
有人可以建议我使用 Oracle 查询吗?
您可以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演示
为大量输入做好准备 :) 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
。