首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将行聚合到JSON散列中

将行聚合到JSON散列中
EN

Stack Overflow用户
提问于 2013-04-20 06:36:04
回答 2查看 295关注 0票数 1

我有下表:

代码语言:javascript
复制
roles

id |  name | person
---+-------+--------
1  | admin | jon
2  | admin | fred
3  | user  | alfred
4  | user  | jon

其中名称可以更改为任何值。

我想得到一个JSON散列,如下所示:

代码语言:javascript
复制
{"admin": ["jon", "fred"], "user": ["alfred", "jon"]}

使用PL/PGSQL

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-20 09:05:39

我假设它的名字是不同的,因为没有它就不会有任何挑战。使用eval function

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION eval(expression text) RETURNS text
AS
$body$
DECLARE
  result text;
BEGIN
  execute expression INTO RESULT;
  RETURN result;
END;
$body$
language plpgsql

我们可以创建一个动态交叉表:

代码语言:javascript
复制
SELECT eval('SELECT row_to_json(q)
FROM (SELECT '||(SELECT string_agg(DISTINCT '"'||name||'"',',')
                 FROM roles)||'
      FROM crosstab(''SELECT 1,name,array_agg(person)::text[]
                      FROM roles
                      GROUP BY name;
                    '') as ct(row_name int,'||(SELECT string_agg(DISTINCT '"'||name||'"                   text[]',',')
FROM roles)||')
)as q');

编辑

不那么花哨的方法:

代码语言:javascript
复制
SELECT '{'||string_agg(temp,',')||'}'
FROM
(
SELECT '"'||name||'": ['||(string_agg(person,',')::text)||']' as temp FROM roles GROUP BY name
) as q
票数 1
EN

Stack Overflow用户

发布于 2013-04-22 06:46:48

postgres当前的开发版本-未来的9.3 -将把重点放在数据库内部的JSON支持上。根据你需要这个问题的解决方案的速度,你可以等待9.3或安装当前的测试版(应该包括新功能)。

这里有两篇关于json新特性的文章--第一篇是第三方,第二篇是开发树上的JSON lib引用:

  • postgres 9.3 features highligh json
  • postgres devel json lib
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16114475

复制
相关文章

相似问题

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