【问题标题】:Remove long key value pairs in jsonb column in postgres with SQL使用 SQL 删除 postgres 中 jsonb 列中的长键值对
【发布时间】:2021-05-12 19:34:22
【问题描述】:

我正在使用物化视图来合并查询 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 中并没有真正找到这样做的好方法

【问题讨论】:

  • 如果 data1total 长度超过 256 个字符或从 JSONB 中删除所有键/值对,我不清楚您是否要“隐藏”t2.data1其中值超过 256 个字符。顺便说一句:为什么是 256?与 e.g. 相比,短于 256 个字符的字符串没有神奇的性能或存储改进。 258 或 261 个字符。
  • 我要删除键值对。 256 是任何有意义的随机数

标签: sql postgresql jsonb


【解决方案1】:

没有用于此的内置函数。您需要自己编写。

类似的东西:

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;

以上内容处理嵌套的键/值对!它只在第一级检查。

然后在查询中使用它:

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 (...);

【讨论】:

    猜你喜欢
    • 2019-09-03
    • 2021-11-24
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2021-10-06
    • 2017-07-04
    • 2015-07-12
    相关资源
    最近更新 更多