我在一个表中有50列,它只返回一行,我想要一行50列一行显示。
任何人都可以建议我查询Oracle吗?
答案 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
结束。