首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgresql json_array_elements

Postgresql json_array_elements
EN

Stack Overflow用户
提问于 2017-08-16 13:22:10
回答 1查看 13.9K关注 0票数 2

我有两张桌子:

表组- id (大系列)、name (varchar)、mail (json)

表邮件- id (大系列),name (varchar)

我的数据分组

代码语言:javascript
复制
1, en-mails, [{"id" : 1}, {"id" : 2}]
2, fr-mails, [{"id" : 3}, {"id" : 4}]

我的邮件数据

代码语言:javascript
复制
1, mail1@gmail.com
2, mail2@gmail.com
3, mail3@gmail.com
4, mail4@gmail.com

我的问题是:

代码语言:javascript
复制
SELECT tg.name, tm.mail
    FROM groups as tg
    CROSS JOIN LATERAL json_array_elements (tg.mails :: json) group_mails
    LEFT OUTER JOIN mails as tm ON (group_mails ->> 'id') :: BIGINT = tm.c_id

我的结果

代码语言:javascript
复制
Array ( [name] => en-mails [mail] => mail1@gmail.com )
Array ( [name] => en-mails [mail] => mail2@gmail.com )
Array ( [name] => fr-mails [mail] => mail3@gmail.com )
Array ( [name] => fr-mails [mail] => mail4@gmail.com )

我的问题-如何返回查询:

代码语言:javascript
复制
Array ( [name] => en-mails [mail] => [mail1@gmail.com, mail2@gmail.com] )
Array ( [name] => fr-mails [mail] => [mail1@gmail.com, mail2@gmail.com] )

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-16 14:39:17

使用聚合函数阿格()

代码语言:javascript
复制
SELECT tg.name, array_agg(tm.mail) as mail
FROM groups as tg
CROSS JOIN LATERAL json_array_elements (tg.mails :: json) group_mails
LEFT OUTER JOIN mails as tm ON (group_mails ->> 'id') :: BIGINT = tm.id
GROUP BY 1

   name   |               mail                
----------+-----------------------------------
 en-mails | {mail1@gmail.com,mail2@gmail.com}
 fr-mails | {mail3@gmail.com,mail4@gmail.com}
(2 rows)    
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45714787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档