加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL返回的结果集为JSON数组?

发布时间:2020-12-13 16:50:24 所属栏目:百科 来源:网络整理
导读:我想让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"},
我想让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)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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读