【问题标题】:Combining results into a JSON object将结果组合成 JSON 对象
【发布时间】:2015-07-06 01:32:38
【问题描述】:

我想知道是否可以将结果列表作为 JSON 对象返回。我的查询比下面的更复杂,但为了简单起见,请表达我的目标。

SELECT 
    r.name, r.address
FROM "Locations" AS r 
LEFT JOIN "Units" AS f 
    ON r.city = f.city

每个位置有许多潜在的单位,但最好是那些以 JSON 形式返回的单位,而不是修改我的完整表结构。

所以我正在寻找的响应是每个位置的一行,包含以下列:名称(字符串)、地址(字符串)和单位(JSON 代表所有行)。

这在 MySQL 中永远不可能,想知道我是否可以在 Postgres 中做到这一点。将 JSONd 的数据不大,所以我不太关心性能。

【问题讨论】:

  • 绝对使用 9.4
  • 我确实做到了,只是无法适应我的解决方案。
  • 最初将其标记为stackoverflow.com/q/13227142/398670 的副本,但严格来说并非如此,因为它不涉及聚合。请显示样本数据(最好是CREATE TABLEINSERT语句)和预期结果

标签: sql postgresql


【解决方案1】:

你会想要这样的东西:

SELECT 
    json_build_object(
      'name', r.name,
      'address', r.address,
      'units', json_agg( json_build_object(
        'number', f.number,
        -- etc etc fields of units here
      ))
    )
FROM "Locations" AS r 
LEFT JOIN "Units" AS f 
    ON r.city = f.city
GROUP BY r.id;

由于您没有提供架构、示例数据、预期输出等,因此很难完全确定。

请注意,您不能嵌套 json_agg 调用。对于存在多个连接级别的多级结果,需要一种不同的方法。如果您担心,请尝试提供更能反映您的实际用例的内容,包括示例数据和预期结果。

您可能需要使用 FROM 中的一系列嵌套查询重新制定公式,以获得所需的嵌套级别聚合。我相信条件上拉和下推仍应防止为要丢弃的行创建 JSON,但尚未最终验证这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多