PostgreSQL返回结果集为JSON数组?

我想让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; 

而且我觉得我很接近,但不是真的。 我应该看看9.15以外的其他文档吗? JSON函数和操作符 ?

顺便说一下,我不确定我的想法。 这是一个通常的devise决定? 我的想法是,当然,我可以将上述3个查询中的第一个的结果(例如)在应用程序中提供给客户端之前稍微在应用程序中进行操作,但是如果PostgreSQL可以直接创build最终的JSON对象,这会更简单,因为我的应用程序中仍然没有包含任何JSON库的依赖。

试试这个查询:

 SELECT array_to_json(array_agg(t)) FROM t 

结果是以下JSON:

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

这是一个SQLFiddle: http ://sqlfiddle.com/#!15/5860d/11/0。 SQLFiddle结果在JSON对象中有一些奇怪的"Value" / "Type"事件,它转义结果string(映射为"Value" ),但在普通PostgreSQL上运行时似乎没有发生。 这似乎是SQLFiddle的一些怪癖。

至于这是一个好的devise还是不取决于你的具体应用。 一般来说,基准testing将是最好的方式来分辨这是否适合您的performance。 在可维护性方面,我没有看到任何特别的问题。 恰恰相反。 它简化了您的应用程序代码,意味着至less在我看来,维护起来更less。 如果PG能给出你需要的结果,那么我可以考虑不使用它的唯一原因是性能方面的考虑。 不要重新发明轮子。

编辑:

我没有意识到你正在寻找两个结果的查询。

首先,为了你的第二个结果,你可以使用:

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

子查询允许您控制生成的JSON对象中的键名称。 这给了

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

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

其次,在我的挖掘中,我发现了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的字段,然后聚合然后作为数组。

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