2017-02-21 106 views
1

我想從postgresql請求創建Json格式。從Postgresql請求格式化JSON表

首先我已經使用的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; 

For test:

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]]