PostgreSQL返回结果集为JSON数组?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

我希望PostgreSQL将查询结果作为一个JSON数组返回。给出

create table t (a int primary key, b text);

insert into t values (1, 'value1');
insert into t values (2, 'value2');
insert into t values (3, 'value3');

我想要类似的东西

[{"a":1,"b":"value1"},{"a":2,"b":"value2"},{"a":3,"b":"value3"}]

{"a":[1,2,3], "b":["value1","value2","value3"]}

(实际上,两者都知道会更有用)。我试过一些事情

select row_to_json(row) from (select * from t) row;
select array_agg(row) from (select * from t) row;
select array_to_string(array_agg(row), '') from (select * from t) row;

顺便说一下,我对我的想法不太确定。这是通常的设计决策吗?我的想法是,当然,我可以将上述3种查询中的第一种查询的结果(例如)放在应用程序中稍微操作,然后再将其提供给客户端,但是如果PostgreSQL可以直接创建最终的JSON对象的话。这会更简单,因为我还没有在我的应用程序中包含对任何JSON库的依赖。

提问于
用户回答回答于

尝试以下查询:

SELECT array_to_json(array_agg(t)) FROM t

结果是以下JSON:

[{"a":1,"b":"value1"},{"a":2,"b":"value2"},{"a":3,"b":"value3"}]

至于它是否是一个好的设计,实际上取决于您的具体应用程序。一般来说,基准测试将是最好的方法来判断这是否适合你的性能。在可维护性方面,我没有看到任何特殊的问题。恰恰相反。它简化了你的应用程序代码,意味着至少在我看来,维护的次数更少了。如果PG能给出你想要的结果,那么我能想到的不使用它的唯一原因就是性能方面的考虑。

SELECT row_to_json(r) FROM (SELECT array_agg(t.a) AS a , array_agg(t.b) AS b FROM t ) r

子查询允许您控制结果JSON对象中的键名。这给了

{"a":[1,2,3],"b":["value1","value2","value3"]}

其次,在我的挖掘中,我发现了9.3引入的一些其他功能,应该考虑:

1)json_agg:这是你第一次想要的结果的结果。

SELECT json_agg(t) FROM t

SQLFiddle:http://sqlfiddle.com/#!15/5860d/38/0

2)to_json*这可以代替任何一种array_to_jsonrow_to_json并给出了同样的结果。

SELECT to_json(array_agg(t)) FROM t

SQLFiddle:http://sqlfiddle.com/#!15/5860d/10/0

用户回答回答于

另外,如果希望从表中选择字段并进行聚合,那么作为数组。

SELECT json_agg(json_build_object('data_a',a,
                                  'data_b',b,
))  from t;

结果会来的。

 [{'data_a':1,'data_b':'value1'}
  {'data_a':2,'data_b':'value2'}]

扫码关注云+社区