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_json
或row_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'}]