unpivot用法 MySql_unpivot和PostgreSQL

创建一个示例表:

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

希望有帮助!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值