2015-11-04 26 views
1

表我查詢看起來像這樣:Postgres的:多重嵌套的JSON

namespace | key | value 
--------------------------- 
foo  | bar | baz 
foo  | alpha | beta 
gamma  | delta | epsilon 

而我願意把它拉出來的數據庫是這樣的:

{ 
    "foo": { 
     "bar": "baz", 
     "alpha": "beta" 
    }, 
    "gamma": { 
     "delta": "epsilon" 
    } 
} 

與周圍玩json_object_agg實際上並沒有讓我超過第一級,因爲你不允許嵌套聚合函數。但據我所知,我需要一個GROUP BYGROUP BY,但我不知道這是可能的。或許解決方案與WINDOW有關?

回答

2
with t (namespace, key, value) as (
    values 
    ('foo','bar','baz'),('foo','alpha','beta'),('gamma','delta','epsilon') 
), s as (
    select namespace, json_object_agg(key, value) as joa 
    from t 
    group by namespace 
) 
select json_object_agg(namespace, joa) 
from s 
; 
            json_object_agg         
------------------------------------------------------------------------------------ 
{ "foo" : { "bar" : "baz", "alpha" : "beta" }, "gamma" : { "delta" : "epsilon" } } 

作爲CTE是一種優化屏障此版本可能會更快:

with t (namespace, key, value) as (
    values 
    ('foo','bar','baz'),('foo','alpha','beta'),('gamma','delta','epsilon') 
) 
select json_object_agg(namespace, joa) 
from (
    select namespace, json_object_agg(key, value) as joa 
    from t 
    group by namespace 
) s