当前位置: 首页 > 知识库问答 >
问题:

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

汲灿
2023-03-14

我希望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;

共有1个答案

壤驷高洁
2023-03-14
SELECT json_agg(t) FROM t

对于对象的JSON数组,以及

SELECT
    json_build_object(
        'a', json_agg(t.a),
        'b', json_agg(t.b)
    )
FROM t

对于数组的JSON对象。

本节描述如何生成对象的JSON数组,并将每一行转换为单个对象。结果看起来是这样的:

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

json_agg函数产生这个开箱即用的结果。它会自动找出如何将其输入转换为JSON并将其聚合到数组中。

SELECT json_agg(t) FROM t
SELECT to_jsonb(array_agg(t)) FROM t
SELECT json_agg(t)::jsonb FROM t
SELECT array_to_json(array_agg(t)) FROM t

您可以选择在查询中包含row_to_json调用:

SELECT array_to_json(array_agg(row_to_json(t))) FROM t

这将每一行转换为JSON对象,将JSON对象聚合为数组,然后将数组转换为JSON数组。

我看不出两者之间有什么显著的性能差异。

{"a":[1,2,3], "b":["value1","value2","value3"]}
SELECT
    json_build_object(
        'a', json_agg(t.a),
        'b', json_agg(t.b)
    )
FROM t
SELECT to_json(r)
FROM (
    SELECT
        json_agg(t.a) AS a,
        json_agg(t.b) AS b
    FROM t
) r

哪一个更清楚,见仁见智。如果使用json_build_object函数,我强烈建议在一行上放置一个键/值对以提高可读性。

您还可以使用array_agg来代替json_agg,但我的测试表明json_agg稍微快一些。

没有json_build_object函数的jsonb版本。您可以聚合到单行中并转换:

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

与针对这类结果的其他查询不同,array_agg在使用to_jsonb时似乎更快一些。我怀疑这是由于开销解析和验证json_agg的JSON结果。

也可以使用显式强制转换:

SELECT
    json_build_object(
        'a', json_agg(t.a),
        'b', json_agg(t.b)
    )::jsonb
FROM t

根据我的测试,to_jsonb版本允许您避免强制转换,并且速度更快;同样,我怀疑这是由于解析和验证结果的开销造成的。

SELECT to_json(r)
FROM (
    SELECT
        json_agg(t.a) AS a,
        json_agg(t.b) AS b
    FROM t
) r
SELECT to_jsonb(r)
FROM (
    SELECT
        array_agg(t.a) AS a,
        array_agg(t.b) AS b
    FROM t
) r

(9.3没有jsonb)

在9.2中,甚至不存在to_json。必须使用row_to_json:

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

在JSON functions中找到JSON函数的文档。

SELECT COALESCE(json_agg(t), '[]'::json) FROM t
SELECT to_jsonb(COALESCE(array_agg(t), ARRAY[]::t[])) FROM t

Hannes Landeholm指出了这一点

 类似资料:
  • 问题内容: 我想让PostgreSQL将查询结果作为一个JSON数组返回。给定 我想要类似的东西 要么 (实际上,同时了解两者会更有用)。我尝试过一些类似的事情 而且我觉得我很亲近,但真的不在那儿。我是否应该查看9.15以外的其他文档。JSON函数和运算符? 顺便说一下,我不确定我的想法。这是通常的设计决定吗?我的想法是,我当然可以接受上述3个查询中的第一个查询的结果(例如),并在将其提供给客户端

  • 问题内容: 我正在尝试创建一种方法,从中可以查询数据库并检索整个表。 目前,如果我使用这些数据只是正常工作 中 的方法。但是,我希望该方法返回结果。 我正在了解当前代码。 我该如何实现? 问题答案: 您永远不要通过公共方法来回避。这很容易导致资源泄漏,因为您不得不保持语句和连接打开。关闭它们将隐式关闭结果集。但是,将它们保持打开状态将导致它们悬而未决,并且当它们打开过多时,将导致数据库用尽资源。

  • 我有程序: 我的问题是,如何从第一个查询中获取ID并在第二个查询中使用它们,或者我可以通过某种方式声明变量并从第一个查询中选择到这个变量ID中,然后在第二个查询中使用这个变量?我的任务找不到解决方法...请帮帮我

  • 问题内容: 我正在使用JDBC来实现非常简单的数据库连接。 我已经创建了连接/语句并执行了查询。我在调试器中检查语句的查询对象,以确认它正在发送正确的查询。然后,我再次检查了数据库中的查询(直接从调试器复制),以确保其返回数据。但是,返回的结果集在.next()上给出false 这里有我遗漏的常见陷阱吗? 还有myDB类(一个简单的包装程序,使我可以将连接/语句代码放入任何项目中) 编辑:根据建议

  • 问题内容: 下面的查询: 给我这样的结果: 我想要的是这样的结果: 如何更改原始SQL查询以得到上面的结果? 问题答案: 您要使用,这应该可以工作: 请注意,不再存在,因为它正在聚合。

  • 问题内容: 我编写了一些使用JSON编码的ASP.NET Web服务,例如: 返回的JSON是: 为什么将参数命名为?我可以控制吗?说,要? 问题答案: 这是一项“安全性”功能,可防止在Eval语句内的javascript中直接执行返回的JSON。或者类似的东西。 有关此主题的更多信息:http : //encosia.com/a-breaking-change-between-versions-