2017-02-21 16 views
1

Я пытаюсь создать Json-формат из запроса postgresql.Форматирование таблицы JSON из запроса Postgresql

Во-первых, я использовал Rails, чтобы запросить мою базу данных в блоке моего контроллера в format.json, а затем использовали json.builder файл форматировать вид JSon. Он работал до тех пор, пока мои запросы не возвратят сотни тысяч строк, поэтому я искал, как оптимизировать создание json, избегая всего стека ActiveRecord.

Для этого я использую Postgresql 9.6 функции JSon получить непосредственно мои данные в нужном формате, который, например:

SELECT array_to_json('{{1157241840,-1.95},{1157241960,-1.96}}'::float[]); 
[[1157241840, -1.95], [1157241960, -1.96]] 

Но используя данные такого рода запроса:

SELECT date,value FROM measures; 

лучшее, что я мог бы получить что-то вроде этого:

SELECT array_to_json(array_agg(t)) FROM (SELECT date,value FROM measures) t; 

Результирующее в:

[ 
{"date":"1997-06-13T19:12:00","value":1608.4}, 
{"date":"1997-06-13T19:12:00","value":-0.6} 
] 

, который совсем другой ... Как бы вы построили этот запрос SQL?
Спасибо за помощь!

Мои меры таблица выглядит следующим образом:

 id | value |   created_at  |   updated_at   | parameter_id | quality_id | station_id |   date  | campain_id | elevation | sensor_id | comment_id 
--------+-------+----------------------------+----------------------------+--------------+------------+------------+---------------------+------------+-----------+-----------+------------ 
    799634 | -1.99 | 2017-02-21 09:41:09.062795 | 2017-02-21 09:41:09.118807 |   2 |   |   1 | 2006-06-26 23:24:00 |   1 |  -5.0 |   | 
1227314 | -1.59 | 2017-02-21 09:44:12.032576 | 2017-02-21 09:44:12.088311 |   2 |   |   1 | 2006-11-30 19:48:00 |   1 |  -5.0 |   |   
1227315 | 26.65 | 2017-02-21 09:44:12.032576 | 2017-02-21 09:44:12.088311 |   3 |   |   1 | 2006-11-30 19:48:00 |   1 |  -5.0 |   |   
+0

показать образец мер .. –

+0

'id | стоимость | created_at | updated_at | parameter_id | quality_id | station_id | дата | campain_id | высота | sensor_id | comment_id 799634 | -1,99 | 2017-02-21 09: 41: 09.062795 | 2017-02-21 09: 41: 09.118807 | 2 | | 1 | 2006-06-26 23:24:00 | 1 | -5,0 | | ' –

+0

Извините за плохой отступ, я не нашел, как разбить строку в комментариях. Заголовок меры останавливается на «comment_id», и образец начинается с 799634. –

ответ

1

Если вам нужен массив массива необходимо использовать json_build_array:

SELECT json_agg(json_build_array(date,value)) FROM measures; 

Если вы хотите преобразовать метку времени к эпохе:

SELECT json_agg(json_build_array(extract(epoch FROM date)::int8, value)) FROM measures; 

Для испытания:

WITH measures AS (
    SELECT 1157241840 as date, -1.95 as value 
    UNION SELECT 1157241960, -1.96 
    UNION SELECT 1157241980, NULL 
) 


SELECT json_agg(json_build_array(date,value)) FROM measures; 


          json_agg        
---------------------------------------------------------------- 
[[1157241840, -1.95], [1157241960, -1.96], [1157241980, null]] 
+0

Тест работает на меня, json_build_array или jsonb_build_array с моей базой данных. Но когда я пытаюсь построить массив массива с json_agg или array_agg, у меня просто есть пустой результат. –

+0

Не могли бы вы попробовать json_agg для некоторых данных из вашей таблицы? Попробуйте сделать это с одной строкой. –

+0

Спасибо. Это действительно проблема с форматом json_agg, тем меньше выход на моем терминале не показывал результат, и я не знаю, почему Сделав тест только на одну строку, я это заметил. –

0
create table measures (date timestamp, value float); 
insert into measures (date, value) values 
(to_timestamp(1157241840),-1.95), 
(to_timestamp(1157241960),-1.96); 

select array_to_json(array_agg(array[extract(epoch from date), value]::float[])) 
from measures 
; 
       array_to_json    
----------------------------------------- 
[[1157241840,-1.95],[1157241960,-1.96]] 

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

  • Нет связанных вопросов^_^