为了账号安全,请及时绑定邮箱和手机立即绑定

unpivot和PostgreSQL

unpivot和PostgreSQL

繁星coding 2019-09-24 10:37:21
PostgreSQL中有一个不可更改的等效函数吗?
查看完整描述

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])将数组的每个元素的结果分成一行。


希望有帮助!


查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 898 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信