问题描述
我有一些数据结构大致如下:
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