postgresql json: 键作为值
postgresql json: keys as values
我刚刚发现了 postgresql 的 json 功能,但无法理解如何使用查询生成 json。我希望我问的问题是有道理的,如果我遗漏了一些明显的问题,请原谅。
我的问题?如何生成 json 其中一些值是其他值的键。
这里有一个例子
drop table if exists my_table;
create table my_table(id int, sale_year int, sale_qty int);
insert into my_table values (10, 2007, 2);
insert into my_table values (10, 2008, 1);
insert into my_table values (10, 2009, 0);
insert into my_table values (20, 2009, 2);
insert into my_table values (30, 2011, 1);
insert into my_table values (30, 2012, 3);
下面的语句
SELECT id, json_agg(to_json(my_table)) FROM public.my_table group by id;
每个 id 给我一个 json(例如 id = 20)
20, [{"id":20, "sale_year": 2009, "sale_qty": 2}]
我的问题是:
是否可以 return 具有以下结构的 json?
{"2009": 2}
我想你想要这样的东西:
select id, json_agg(json_build_object(sale_year, sale_qty))
from my_table
group by id
order by id;
这个returns:
id | json_agg
---+-------------------------------------------
10 | [{"2007" : 2}, {"2008" : 1}, {"2009" : 0}]
20 | [{"2009" : 2}]
30 | [{"2011" : 1}, {"2012" : 3}]
我希望这对其他人有帮助
在某些情况下,人们想要获取的不是 jsonb 数据数组,而是单个 jsonb 元素。
受此启发post这是一个如何做到这一点的例子
with tx1
as
(
select
*
from
(values
(10, 2007, 2),
(10, 2008, 1),
(10, 2009, 0),
(20, 2009, 2),
(30, 2011, 1),
(30, 2012, 3))
as t (id, sale_year, sale_qty)),
tx2
as
(select id,
jsonb_agg(json_build_object(sale_year, sale_qty)) as x_data
from tx1
group by id
order by id)
SELECT
id,
x_data,
jo.obj
FROM tx2
CROSS JOIN
LATERAL
(
SELECT JSON_OBJECT_AGG(jt.key, jt.value) obj
FROM JSONB_ARRAY_ELEMENTS(x_data) je
CROSS JOIN
LATERAL JSONB_EACH(je.value) jt
) jo
这给出了
{ "2007" : 2, "2008" : 1, "2009" : 0 }
{ "2011" : 1, "2012" : 3 }
我刚刚发现了 postgresql 的 json 功能,但无法理解如何使用查询生成 json。我希望我问的问题是有道理的,如果我遗漏了一些明显的问题,请原谅。
我的问题?如何生成 json 其中一些值是其他值的键。 这里有一个例子
drop table if exists my_table;
create table my_table(id int, sale_year int, sale_qty int);
insert into my_table values (10, 2007, 2);
insert into my_table values (10, 2008, 1);
insert into my_table values (10, 2009, 0);
insert into my_table values (20, 2009, 2);
insert into my_table values (30, 2011, 1);
insert into my_table values (30, 2012, 3);
下面的语句
SELECT id, json_agg(to_json(my_table)) FROM public.my_table group by id;
每个 id 给我一个 json(例如 id = 20)
20, [{"id":20, "sale_year": 2009, "sale_qty": 2}]
我的问题是:
是否可以 return 具有以下结构的 json?
{"2009": 2}
我想你想要这样的东西:
select id, json_agg(json_build_object(sale_year, sale_qty))
from my_table
group by id
order by id;
这个returns:
id | json_agg
---+-------------------------------------------
10 | [{"2007" : 2}, {"2008" : 1}, {"2009" : 0}]
20 | [{"2009" : 2}]
30 | [{"2011" : 1}, {"2012" : 3}]
我希望这对其他人有帮助
在某些情况下,人们想要获取的不是 jsonb 数据数组,而是单个 jsonb 元素。
受此启发post
with tx1
as
(
select
*
from
(values
(10, 2007, 2),
(10, 2008, 1),
(10, 2009, 0),
(20, 2009, 2),
(30, 2011, 1),
(30, 2012, 3))
as t (id, sale_year, sale_qty)),
tx2
as
(select id,
jsonb_agg(json_build_object(sale_year, sale_qty)) as x_data
from tx1
group by id
order by id)
SELECT
id,
x_data,
jo.obj
FROM tx2
CROSS JOIN
LATERAL
(
SELECT JSON_OBJECT_AGG(jt.key, jt.value) obj
FROM JSONB_ARRAY_ELEMENTS(x_data) je
CROSS JOIN
LATERAL JSONB_EACH(je.value) jt
) jo
这给出了
{ "2007" : 2, "2008" : 1, "2009" : 0 }
{ "2011" : 1, "2012" : 3 }