2016-05-11 10 views
0

私はちょうどpostgresqlのjson機能を発見しましたが、クエリでjsonを生成する方法を理解できませんでした。私は、私が質問している質問が意味を成していることを願っています。postgresql json:keys as values

私の問題?いくつかの値を他の人の鍵とする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}] 

、私の質問は:

です次の構造のjsonを返すことは可能ですか?

select id, json_agg(json_build_object(sale_year, sale_qty)) 
from my_table 
group by id 
order by id; 

これが返されます:

{"2009": 2} 

答えて

1

は、私はあなたがこのような何かをしたいと思います

id | json_agg         
---+------------------------------------------- 
10 | [{"2007" : 2}, {"2008" : 1}, {"2009" : 0}] 
20 | [{"2009" : 2}]        
30 | [{"2011" : 1}, {"2012" : 3}]    
+0

幻想を与えます。どうもありがとう。 – user1043144

+0

結果として、リストではなくキー値を持つjsonbを持つことは可能でしょうか? {"2007":2}、{"2008":1}、{"2009":0}]のように{{"2007":2、 "2008":1、 "2009"別の質問でこれを尋ねるべきですか? – user1043144

0

私は、これはいくつかのケースで

他の誰かを助けることを願っています、 1つは、の配列ではなく、取得したいと思いますjsonbデータではなく、単一のjsonb要素。この記事this 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 }