2015-04-09 3 views
1

Я могу выбрать строки как JSON из Postgres, например.Postgres select as json hash

select row_to_json(t) 
    from (
     select id, name from accounts 
    ) t 

который возвращает каждую строку в следующем формате:

{"id":6001,"name":"Foo"} 

Я хотел бы получить их в этом формате:

{ 6001: {"name":"Foo"} } 

Возможно ли это?

Edit:

Это поможет мне правильный формат для одной строки:

select json_build_object(id,json_build_object('name',name)) from accounts 

Но то, что я в конечном счете, после того, как это все строки в одной хэш индексируется по ключу, например,

{ 
    6001: {"name":"Foo"}, 
    6002: {"name":"Bar"}, 
    6003: {"name":"Baz"}, 
} 

Это заставляет меня ближе:

select array_to_json(array_agg(json_build_object(id,json_build_object('name',name)))) 
from accounts 

Но это еще не совсем там, производя массив хэшей:

[ 
    { 6001: {"name":"Foo"} }, 
    { 6002: {"name":"Bar"} }, 
    { 6003: {"name":"Baz"} }, 
] 

ответ

3

Вы пытаетесь агрегировать, поэтому используйте the aggregate function json_object_agg(), который «объединяет пары имя/значение как объект JSON». id ваш ключ, и значение, которое вы можете создать с json_build_object():

select json_object_agg(id, json_build_object('name', name)) 
from accounts 
+0

Блестящий! Спасибо – jemminger

+0

Когда я запустил это, он возвращает массив объектов JSON, таких как '' '[ {6001: {" name ":" Foo "}}, {6002: {" name ":" Bar "}}, {6003: { "имя": "Баз"}}, ] '' '' –

+0

ВЫБОР \t \t \t cm.name, \t \t \t cm.short_code, \t \t \t cm.timezone, \t \t \t ST_Y (map_center :: geometry) AS lat, \t \t \t ST_X (map_center :: геометрия) в сжиженном, \t \t \t CONCAT_WS ('', \t \t \t \t ST_YMIN (cz.mpoly :: геометрия), \t \t \t \t ST_XMIN (CZ.mpoly :: геометрия) \t \t \t) КАК ТЛ, \t \t \t CONCAT_WS ('', \t \t \t \t ST_YMAX (cz.mpoly :: геометрия), \t \t \t \t ST_XMAX (cz.mpoly :: геометрия) \t \t \t) КАК бр \t \t ОТ \t \t \t core_market см \t \t \t РЕГИСТРИРУЙТЕСЬ core_zone CZ ON (cz.market_id = cm.id) \t \t ГДЕ \t \t \t удален = False \t \t \t И cz.active = True \t \t \t И cz.beta = False \t \t ГРУППА ПО \t \t \t cm.name, cm.short_code, cm.timezone, \t \t \t cm.map_ce nter, cz.mpoly; ' –

0

Может быть что-то вроде этого:

select json_build_object(id,json_build_object('name',name)) from accounts 

http://www.postgresql.org/docs/9.4/static/functions-json.html

+0

ближе, она работает для одной строки, но не то, что я после нескольких результатов. Я более подробно изложил вопрос выше. – jemminger