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 }