【问题标题】:Formatting JSON table from Postgresql request从 Postgresql 请求格式化 JSON 表
【发布时间】:2017-02-21 15:47:04
【问题描述】:

我正在尝试从 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 |           |           

【问题讨论】:

  • 显示测量样本..
  • 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 | |
  • 抱歉缩进不好,我还没有找到如何在 cmets 中换行。度量的标题在“comment_id”处停止,示例从 799634 开始。
  • 请用字段更新您的问题,而不是评论。同样,当我运行您的示例时,出现错误:t=# SELECT array_to_json('{{1157241840,-1.95},{1157241960,-1.96}}'::int[]); ERROR: invalid input syntax for integer: "-1.95" LINE 1: SELECT array_to_json('{{1157241840,-1.95},{1157241960,-1.96}...
  • 确实,我的意思不是 int[] 而是 float[]。我编辑了我的问题。

标签: ruby-on-rails json postgresql


【解决方案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]]

【讨论】:

  • 测试对我有用,json_build_array 或 jsonb_build_array 也适用于我的数据库。但是当我尝试使用 json_agg 或 array_agg 构建数组时,我只有一个空结果。
  • 您可以尝试使用 json_agg 获取表中的一些数据吗?试着用一行来做。
  • 谢谢。这确实是 json_agg 格式的问题,我的终端上的较少输出没有显示结果,我不知道为什么。通过仅对一行进行测试,我注意到了这一点。
【解决方案2】:
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]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2015-01-23
    • 1970-01-01
    • 2018-12-29
    相关资源
    最近更新 更多