【问题标题】:PostgreSQL aggregate function calls cannot be nested using jsonb_agg functionPostgreSQL 聚合函数调用不能使用 jsonb_agg 函数嵌套
【发布时间】:2017-08-09 00:09:23
【问题描述】:

我正在尝试让我的查询返回 JSON 以在 API 中使用。我正在使用 PostGIS 扩展来处理位置信息。 PostGIS 扩展运行良好,不存在这个问题。我只提到这一点是因为查询中有与 PostGIS 扩展相关的函数。我有 JSON 文档的这些对象:

  • 公司主要文件(确定)
  • 与公司相关的事件(OK)
  • 与事件相关的日期(* 这是我们遇到问题的地方)
  • 与公司相关的地址 (OK)
  • 与公司相关的城市 (OK)

这是我的 SQL 语句:

SELECT c.id, c.name, c.website, c.longdescription, c.description, c.email, 
jsonb_agg((SELECT ev FROM (SELECT ev.title, ev.description, ev.longdescription, jsonb_agg((SELECT ed FROM(SELECT ed.startdate, ed.enddate, ed.id WHERE ed.id notnull)ed)) AS dates, ev.id WHERE ev.id notnull)ev)) AS events, 
jsonb_agg((SELECT ca FROM (SELECT ct.zip, ca.id, ca.street1, ca.street2, ca.addresstype_id, ST_Y(ca.geopoint::geometry) AS latitude, ST_X(ca.geopoint::geometry) AS longitude WHERE ca.id notnull)ca)) AS addresses
FROM companies c
LEFT JOIN events ev ON ev.company_id = c.id
LEFT JOIN companyaddresses ca ON ca.company_id = c.id
LEFT JOIN cities ct ON ct.id = ca.city_id
LEFT JOIN eventdates ed ON ed.event_id = ev.id
GROUP BY c.id

我有什么想法可以改造成没有嵌套函数并仍然得到正确的结果吗?

【问题讨论】:

    标签: json postgresql


    【解决方案1】:

    有问题的行是

    jsonb_agg((SELECT ev FROM (SELECT ev.title, ev.description, ev.longdescription, jsonb_agg((SELECT ed FROM(SELECT ed.startdate, ed.enddate, ed.id WHERE ed.id notnull)ed)) AS dates, ev.id WHERE ev.id notnull)ev)) AS events, 
    

    如果您将jsonb_agg 移动到第二个子查询中,我认为它会起作用。所以改变

    jsonb_agg((SELECT ed FROM(SELECT ed.startdate, ed.enddate, ed.id WHERE ed.id notnull)ed)) AS dates
    

    进入

    (SELECT jsonb_agg(ed) FROM(SELECT ed.startdate, ed.enddate, ed.id WHERE ed.id notnull)ed) AS dates
    

    我不确定这是否可行,但如果您向 edev 表提供 CREATE 语句,我可以对其进行改进。

    【讨论】:

    • 所以我没有意识到由于连接,我有重复的记录。有什么建议么?再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多