Postgresql - 对匹配键求和 JSON 行

jot*_*mon 3 postgresql json aggregate-functions

我的数据库中有两列,一列是 uid (myuid),另一列是代表每个用户宠物总数的键值对 (totalpetsjson)。我想查询 uid,然后对键匹配的结果 JSON 行求和。

这个查询

SELECT totalpetsjson FROM mytable WHERE "myuid" IN ('john','andy') 
Run Code Online (Sandbox Code Playgroud)

结果分为两行

{'dogs':3,'cats':5,'fish':144}
{'dogs':2,'lizards':4,'cats':3'}
Run Code Online (Sandbox Code Playgroud)

我想要的结果是什么。我如何查询并组合上面两行,如下所示?

{'dogs':5,'cats':8,'fish':144,'lizards':4}
Run Code Online (Sandbox Code Playgroud)

kli*_*lin 5

json_each_text()使用给出pairs的函数(key, value),将其转换values为整数并按groups将它们求和keys。最后将结果聚合为json:

select json_object_agg(key, sum)
from (
    select key, sum(value::int)
    from my_table 
    cross join json_each_text(totalpetsjson)
    where myuid in ('john','andy') 
    group by key
    ) s

                     json_object_agg                     
---------------------------------------------------------
 { "fish" : 144, "lizards" : 4, "cats" : 8, "dogs" : 5 }
(1 row) 
Run Code Online (Sandbox Code Playgroud)

在 db<>fiddle 中测试它