3 回答
TA贡献2011条经验 获得超2个赞
创建一个示例表:
CREATE TEMP TABLE foo (id int, a text, b text, c text);
INSERT INTO foo VALUES (1, 'ant', 'cat', 'chimp'), (2, 'grape', 'mint', 'basil');
您可以使用UNION ALL来“取消透视”或“取消交叉表”:
SELECT id,
'a' AS colname,
a AS thing
FROM foo
UNION ALL
SELECT id,
'b' AS colname,
b AS thing
FROM foo
UNION ALL
SELECT id,
'c' AS colname,
c AS thing
FROM foo
ORDER BY id;
这会在上运行3个不同的子查询foo,每个要取消透视的列一个,然后在一个表中返回每个子查询中的每个记录。
但这将扫描表N次,其中N是您要取消透视的列数。这效率低下,而且是一个很大的问题,例如,当您使用非常大的表进行扫描时,这需要很长时间。
而是使用:
SELECT id,
unnest(array['a', 'b', 'c']) AS colname,
unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;
这更容易编写,并且只会扫描表一次。
array[a, b, c]返回一个数组对象,其值分别为a,b和c。 unnest(array[a, b, c])将数组的每个元素的结果分成一行。
希望有帮助!
添加回答
举报