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 Functions and Operators之外的其他文档吗? 顺便说一句,我不知道我的想法。这是通常的设计决策吗?我的想法是,我可以,当然,取上述第一个查询的结果,并在应用程序中服务它之前操作它的客户端,但如果PostgreSQL可以直接创建最终的JSON对象,它会更简单,因为我还没有包括任何对我的应用程序中的任何JSON库的依赖。
尝试此查询:
SELECT array_to_json(array_agg(t)) FROM t 结果是以下JSON: [{"a":1,"b":"value3"}] 这里是一个SQLFiddle:http://sqlfiddle.com/#!15/5860d/11/0.SQLFiddle的结果有一些奇怪的“值”/“类型”事情在一个JSON对象,它转义结果字符串(映射到“值”),但似乎没有发生当它在普通PostgreSQL上运行时。它似乎是SQLFiddle的一些怪癖。 至于它是一个好的设计或不是真的取决于你的具体应用。一般来说,基准测试将是最好的方式来告诉这是否适合你的性能。在可维护性方面,我没有看到任何特殊的问题。恰恰相反。它简化了你的应用程序代码,意味着有更少的维护,至少在我看来。如果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,"value3"]} SQLFiddle:http://sqlfiddle.com/#!15/5860d/42/0 第二,在我的挖掘中,我发现了9.3中引入的几个其他功能,你应该考虑: 1) SELECT json_agg(t) FROM t SQLFiddle:http://sqlfiddle.com/#!15/5860d/38/0 2) SELECT to_json(array_agg(t)) FROM t SQLFiddle:http://sqlfiddle.com/#!15/5860d/10/0 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |