【问题标题】:postgresql json aggregatepostgresql json聚合
【发布时间】:2016-05-23 20:44:02
【问题描述】:

我使用的是 postgres 9.4,我有以下查询:

SELECT pid, code, name FROM activity, (
  SELECT code FROM project
) projects WHERE activity.pcode = projects.code;

返回以下关系:

pid | code |    name    
-------------------------------
  1 | p1   | activity1 
  1 | p3   | activity2
  2 | p1   | activity3
  2 | p2   | activity4
  2 | p3   | activity5

我正在尝试编写相同的查询,但是我将项目代码和活动名称作为相对于每个“pid”的 json 数组获取

所以我正在寻找一个会返回如下内容的查询:

pid | json    
------------------------------------------------------------------------------------
  1 | [{'code': 'p1', 'name': 'activity1'}, {'code': 'p3', 'name': 'activity2'}] 
  2 | [{'code': 'p1', 'name': 'activity3'}, {'code': 'p2', 'name': 'activity4'}, {'code': 'p3', 'name': 'activity5'}] 

有什么想法吗? 提前感谢您的帮助

更新

这是我所做的(这与 Abelisto 所说的很接近):

SELECT pid, json_agg(json_build_object('code', code, 'name', name)) AS agg                                                                                                                                    
FROM activity JOIN (                                                                                                                                                                                          
  SELECT code FROM project                                                                                                                                                                                    
) AS p ON p.code=activity.pcode                                                                                                                                                                               
GROUP BY pid;    

【问题讨论】:

  • 您是否反对将此作为脚本的一部分?像在python中一样?您可以创建服务器端游标并遍历记录以减少性能问题。
  • @codeBarer 我知道已经五年了。不反对您的建议(在 Python 脚本中进行此转换 - 我个人会在 Python 中执行类似的操作)。但我很好奇其中的原因。你认为用 Python 做会更好吗?我问这个是因为到目前为止我的印象是在数据库引擎中执行比在脚本语言中执行要快得多。您能否详细说明您认为这两种方法的优缺点?

标签: sql json postgresql


【解决方案1】:
select
  pid,
  json_agg(json_build_object('code',code,'name',name))
from
  ...
group by
  pid

【讨论】:

  • 这只是一个很好的答案!
【解决方案2】:
SELECT pid from activity a, (
    select json_agg(project) from project where code = a.code 
) as p

类似的...

【讨论】:

    猜你喜欢
    • 2022-08-16
    • 2017-09-28
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2015-12-21
    • 2019-05-06
    • 2018-01-12
    相关资源
    最近更新 更多