我有下表:
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
答案 0 :(得分:1)
我会假设这个名字可以改变原因而没有它就没有挑战。 使用eval function:
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
答案 1 :(得分:1)
postgres的当前开发版本 - 未来9.3 - 将重点关注数据库内的JSON支持。根据您需要解决此问题的速度,您可以等待9.3或安装当前的测试版(应包括新功能)。
以下是关于新json功能的两篇文章 - 第一个是第三方 - 第二个是开发树上的JSON lib引用: