在 Postgresql 中逆透视

Unpivot in Potgresql

如何在不使用 UNION 的情况下在 Postgresql 中取消透视?我有 100 多列,我正在寻找一种简洁的方法。

给定 table:

id    c1      c2      c3
1      X       Y       Z
2      A       B       C
3      Y       C       Z

想要table:

id   col
1     X
1     Y
1     Z
2     A
2     B
2     C
3     Y
3     C
3     Z

使用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';