使用 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 (...);
我正在使用物化视图来合并查询 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 (...);