2015-02-07 3 views
0

У меня есть этот SQL-запрос:Как вставить значение в массив json через postgresql?

SELECT array_to_json(array_agg(row_to_json(t))) 
FROM (SELECT rendered_json, city_id FROM hotels WHERE id IN (1)) as t 

и после выполнения я получаю:

"[{rendered_json:{address:Den Texstraat 16,city:Amsterdam,hotel_class:2, 
currencycode:EUR,hotel_id:10003,hoteltype_id:14,latitude:52.3588347328288, 
longitude:4.89386737346649,name:Asterisk Hotel,review_score:7.4,min_price:0.0}, 
city_id:-2140479}]" 

Но я хочу, чтобы удалить поле rendered_json и получить

"[{address:Den Texstraat 16,city:Amsterdam,hotel_class:2, 
currencycode:EUR,hotel_id:10003,hoteltype_id:14,latitude:52.3588347328288, 
longitude:4.89386737346649,name:Asterisk Hotel,review_score:7.4,min_price:0.0, 
city_id:-2140479}]" 

Если мой запрос:

SELECT array_to_json(array_agg(row_to_json(t)::json->'rendered_json')) 
FROM (SELECT rendered_json, city_id FROM hotels WHERE id IN (1)) as t 

тогда я теряю поле city_id.

Как построить запрос для моих требований? Является ли это возможным?

заранее спасибо

ответ

0

я бы предположить, что rendered_json является излишним и негибкими. Либо он будет устаревать по мере обновления строк, либо у вас много триггеров, которые замедлят обновления и вставки. Вместо того, чтобы пытаться изменить его, что, казалось бы, лишило бы его возможности кэшировать, избавиться от него (или игнорировать его) и самостоятельно создать JSON.

SELECT row_to_json(hotel_data) 
FROM (
    SELECT address, city, hotel_class, currencycode, hotel_id, 
      hoteltype_id, latitude, longitude, name, review_score, 
      min_price, city_id 
    FROM hotels 
    WHERE id = 1 
) as hotel_data 

(я извиняюсь за любые синтаксические ошибки, у меня нет под рукой PG, чтобы проверить его)

Если генерируя это становится дорогим, сделать нормальные оптимизации запросов, и если это не работает consider a query cache.

+0

Спасибо. Это работы! Но слишком много написания ... На самом деле в 'rendered_json' гораздо больше полей (я вырезал при создании вопроса) –

+0

@DmitryKrakosevich Это слишком много написания, если вы пишете его более одного раза. Если вы пишете его более одного раза, напишите программу, чтобы сделать это за вас. – Schwern

Смежные вопросы