在值上过滤Postgres jsonb字段,仅返回匹配的键值对

问题描述

我有一些数据结构大致如下:

id  | data

1   | {"a": 4,"b": 5,"c": 19}
2   | {"a": 6,"b": 7}
3   | {"a": 8,"d": 3}
4   | {"a": 3,"b": 1}

我希望能够根据json中键的值过滤此数据。如您所见,键在记录之间可能有所不同。例如,我想获得每行值大于4的所有键值对。对于上述数据,应该给出:

id  | data
1   | {"b": 5,"b": 7}
3   | {"a": 8}
4   | {} (for this row,it's fine if it's just left out,or returned as empty object)

我一直在寻找答案,就像提供的here一样,但我不想提供特定的字段名称。另外,如果条件成立,我想同时获取键和值。这是我第一次使用Postgres jsonb,所以我可能缺少一个函数

解决方法

您需要将jsonb_each()与子查询一起使用:

select d.id,t.new_data
from the_table d 
  cross join lateral (
     select jsonb_object_agg(key,value) as new_data
     from jsonb_each(d.data) as x(key,value)
     where value::int > 4
  ) as t