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

使用函数jsonb_array_elements():

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 比我们更快到达那里(谢谢你们)- 所以积分归于他们。