在 Postgresql 中反透视
Posted
技术标签:
【中文标题】在 Postgresql 中反透视【英文标题】:Unpivot in Potgresql 【发布时间】:2017-08-30 01:00:00 【问题描述】:如何在不使用 UNION 的情况下在 Postgresql 中进行反透视?我有超过 100 列,我正在寻找一种简洁的方法来完成它。
给定表:
id c1 c2 c3
1 X Y Z
2 A B C
3 Y C Z
想要的表:
id col
1 X
1 Y
1 Z
2 A
2 B
2 C
3 Y
3 C
3 Z
【问题讨论】:
【参考方案1】:使用jsonb functions:
select id, value as col
from my_table
cross join jsonb_each_text(to_jsonb(my_table))
where key <> 'id';
id | value
----+-------
1 | X
1 | Y
1 | Z
2 | A
2 | B
2 | C
3 | Y
3 | C
3 | Z
(9 rows)
Db<>Fiddle.
在 Postgres 9.3 或 9.4 中使用 to_json()
和 json_each_text()
。
在 9.1 或 9.2 版本中安装 hstore:
create extension if not exists hstore;
select id, value as col
from my_table
cross join each(hstore(my_table))
where key <> 'id';
【讨论】:
谢谢@klin。我收到以下错误:函数 to_jsonb(my_table) 不存在。你知道为什么会这样吗? 该功能在 Postgres 9.5+ 中可用;如果您有 9.3 或 9.4 版,请使用json_each_text()
和 to_json()
。
谢谢,但遇到同样的错误。会不会是我的 postgres 安装丢失了什么?
你的 Postgres 版本是多少?
现在是 9.2。大概就是这个原因吧!以上是关于在 Postgresql 中反透视的主要内容,如果未能解决你的问题,请参考以下文章