将平面 jsonb 迁移到 hstore
Migrate flat jsonb to hstore
我 运行 postgres 9.4,并且想将我的数据库 table 中的列迁移到 hstore 只是为了能够进行性能比较。
我当前的列是 jsonb 中的键值对,w/o 嵌套结构。
有什么解决这个问题的技巧吗?
示例数据:
create table jsons (id int, val jsonb);
insert into jsons values
(1, '{"age":22}'),
(2, '{"height":182}'),
(3, '{"age":30, "height":177}');
将 json 个对象拆分为 key
、value
对:
select id, (jsonb_each_text(val)).key, (jsonb_each_text(val)).value
from jsons
id | key | value
----+--------+-------
1 | age | 22
2 | height | 182
3 | age | 30
3 | height | 177
(4 rows)
聚合对并将它们转换为 hstore:
select id, hstore(array_agg(key), array_agg(value))
from (
select id, (jsonb_each_text(val)).key, (jsonb_each_text(val)).value
from jsons
) sub
group by 1
order by 1
id | hstore
----+------------------------------
1 | "age"=>"22"
2 | "height"=>"182"
3 | "age"=>"30", "height"=>"177"
(3 rows)
可以使用横向连接以更优雅的方式完成相同的操作:
select id, hstore(array_agg(key), array_agg(value))
from jsons
cross join jsonb_each_text(val)
group by 1
order by 1;
我 运行 postgres 9.4,并且想将我的数据库 table 中的列迁移到 hstore 只是为了能够进行性能比较。
我当前的列是 jsonb 中的键值对,w/o 嵌套结构。
有什么解决这个问题的技巧吗?
示例数据:
create table jsons (id int, val jsonb);
insert into jsons values
(1, '{"age":22}'),
(2, '{"height":182}'),
(3, '{"age":30, "height":177}');
将 json 个对象拆分为 key
、value
对:
select id, (jsonb_each_text(val)).key, (jsonb_each_text(val)).value
from jsons
id | key | value
----+--------+-------
1 | age | 22
2 | height | 182
3 | age | 30
3 | height | 177
(4 rows)
聚合对并将它们转换为 hstore:
select id, hstore(array_agg(key), array_agg(value))
from (
select id, (jsonb_each_text(val)).key, (jsonb_each_text(val)).value
from jsons
) sub
group by 1
order by 1
id | hstore
----+------------------------------
1 | "age"=>"22"
2 | "height"=>"182"
3 | "age"=>"30", "height"=>"177"
(3 rows)
可以使用横向连接以更优雅的方式完成相同的操作:
select id, hstore(array_agg(key), array_agg(value))
from jsons
cross join jsonb_each_text(val)
group by 1
order by 1;