根据值过滤 Postgres jsonb 字段,return 仅匹配键值对

Filter Postgres jsonb field on values, return only matching key-value pairs

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

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, "c": 19}
2   | {"a": 6, "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() 与 sub-query 一起使用:

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