使用 SQL 删除 postgres 中 jsonb 列中的长键值对

Remove long key value pairs in jsonb column in postgres with SQL

我正在使用物化视图来合并查询 3 json 列,因为我想查询所有这些列以及 1 个 GIN 索引。该视图看起来类似于:

CREATE MATERIALIZED VIEW IF NOT EXISTS test_materialized_view AS
SELECT t1.id, (t1.data1 || t1.data2 || COALESCE(t2.data1, '{}'::jsonb)) "data"
FROM table_1 t1 LEFT JOIN table_2 t2 ON (...);

现在可能会发生 json 数据中有更长的键值对,我不想查询这些键值对,并且可以存储 1000 次,因为它们在 t2.data1 中。是否可以过滤合并后的json只包含长度小于x个字符的键值对?这甚至会有所作为/减少保存的数据吗?

我不知道这些字段的 json 键。我基本上只想删除所有长于 x 个字符或数组/嵌套对象的键值对,但在 postgres

中并没有真正找到执行此操作的好方法

没有内置函数。您需要自己编写。

大致情况:

create function remove_long_values(p_input jsonb, p_maxlen int)
  returns jsonb
as
$$
  select coalesce(jsonb_object_agg(e.ky, e.val), '{}')
  from jsonb_each(p_input) as e(ky,val) 
  where length(e.val::text) <= p_maxlen;
$$
language sql
immutable
parallel safe;

以上 处理嵌套的 key/value 对!它只在第一层检查这个。

然后在查询中使用它:

CREATE MATERIALIZED VIEW IF NOT EXISTS test_materialized_view 
AS
SELECT t1.id, t1.data1 || t1.data2 || remove_long_values(t2.data1,250) as "data"
FROM table_1 t1 
  LEFT JOIN table_2 t2 ON (...);