PostgreSQL JSONB 在散列内分组数组值
PostgreSQL JSONB grouping array values inside a hash
我们有一个包含散列的 PostgreSQL jsonb
列,而散列又包含值数组:
id | hashes
---------------
1 | {"sources"=>["a","b","c"], "ids"=>[1,2,3]}
2 | {"sources"=>["b","c","d","e","e"], "ids"=>[1,2,3]}
我们想要做的是创建一个 jsonb
查询,它将 return
code | count
---------------
"a" | 1
"b" | 2
"c" | 2
"d" | 1
"e" | 2
我们一直在尝试
SELECT jsonb_to_recordset(hashes->>'sources')
但这不起作用 - 对此非常感谢的任何帮助...
设置(应该是问题的一部分,注意正确的 json 语法):
create table a_table (id int, hashes jsonb);
insert into a_table values
(1, '{"sources":["a","b","c"], "ids":[1,2,3]}'),
(2, '{"sources":["b","c","d","e","e"], "ids":[1,2,3]}');
select code, count(code)
from
a_table,
jsonb_array_elements(hashes->'sources') sources(code)
group by 1
order by 1;
code | count
------+-------
"a" | 1
"b" | 2
"c" | 2
"d" | 1
"e" | 2
(5 rows)
SELECT h, count(*)
FROM (
SELECT jsonb_array_elements_text(hashes->'sources') AS h FROM mytable
) sub
GROUP BY h
ORDER BY h;
我们终于这样工作了:
SELECT jsonb_array_elements_text(hashes->'sources') as s1,
count(jsonb_array_elements_text(hashes->'sources'))
FROM a_table
GROUP BY s1;
但 Klin 的解决方案更完整,而且 Klin 和 Patrick 比我们更快到达那里(谢谢你们)- 所以积分归于他们。
我们有一个包含散列的 PostgreSQL jsonb
列,而散列又包含值数组:
id | hashes
---------------
1 | {"sources"=>["a","b","c"], "ids"=>[1,2,3]}
2 | {"sources"=>["b","c","d","e","e"], "ids"=>[1,2,3]}
我们想要做的是创建一个 jsonb
查询,它将 return
code | count
---------------
"a" | 1
"b" | 2
"c" | 2
"d" | 1
"e" | 2
我们一直在尝试
SELECT jsonb_to_recordset(hashes->>'sources')
但这不起作用 - 对此非常感谢的任何帮助...
设置(应该是问题的一部分,注意正确的 json 语法):
create table a_table (id int, hashes jsonb);
insert into a_table values
(1, '{"sources":["a","b","c"], "ids":[1,2,3]}'),
(2, '{"sources":["b","c","d","e","e"], "ids":[1,2,3]}');
select code, count(code)
from
a_table,
jsonb_array_elements(hashes->'sources') sources(code)
group by 1
order by 1;
code | count
------+-------
"a" | 1
"b" | 2
"c" | 2
"d" | 1
"e" | 2
(5 rows)
SELECT h, count(*)
FROM (
SELECT jsonb_array_elements_text(hashes->'sources') AS h FROM mytable
) sub
GROUP BY h
ORDER BY h;
我们终于这样工作了:
SELECT jsonb_array_elements_text(hashes->'sources') as s1,
count(jsonb_array_elements_text(hashes->'sources'))
FROM a_table
GROUP BY s1;
但 Klin 的解决方案更完整,而且 Klin 和 Patrick 比我们更快到达那里(谢谢你们)- 所以积分归于他们。