1

我有下表:

roles

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

名称可以变化为任何值。

我想得到一个像这样的 JSON 哈希:

{"admin": ["jon", "fred"], "user": ["alfred", "jon"]}

使用 PL/PGSQL

4

2 回答 2

1

我会假设名称可能会有所不同,因为没有它就没有挑战。使用eval 函数

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

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

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');

编辑

不那么花哨的方法:

SELECT '{'||string_agg(temp,',')||'}'
FROM
(
SELECT '"'||name||'": ['||(string_agg(person,',')::text)||']' as temp FROM roles GROUP BY name
) as q
于 2013-04-20T01:05:38.973 回答
1

postgres 的当前开发版本(未来的 9.3)将重点关注数据库内部的 JSON 支持。根据您需要解决此问题的速度有多快,您可以等待 9.3 或安装当前的测试版(应该包括新功能)。

这里有两篇关于新 json 特性的文章——第一篇是第三方的——第二篇是开发树上的 JSON 库参考:

于 2013-04-21T22:46:48.250 回答