【问题标题】:Postgres: Delete a jsonb key, in a recursive merging functionPostgres:在递归合并函数中删除 jsonb 键
【发布时间】:2023-04-08 09:11:01
【问题描述】:

在将值设置为“__delete__”时,我正在尝试添加对删除 jsonb 中的键的支持。

我在这里找到了一个很好的合并键的功能: http://blog.bguiz.com/2017/json-merge-postgresql/ 但是它不支持从对象中删除键。 就是这样:

CREATE OR REPLACE FUNCTION "public"."jsonb_merge_recurse"("orig" jsonb, "delta" jsonb)
  RETURNS "pg_catalog"."jsonb" AS $BODY$
    select
        jsonb_object_agg(
            coalesce(keyOrig, keyDelta),
            case
                when valOrig isnull then valDelta
                when valDelta isnull then valOrig
                when (jsonb_typeof(valOrig) <> 'object' or jsonb_typeof(valDelta) <> 'object') then valDelta
                else jsonb_merge_recurse(valOrig, valDelta)
            end
        )
    from jsonb_each(orig) e1(keyOrig, valOrig)
    full join jsonb_each(delta) e2(keyDelta, valDelta) on keyOrig = keyDelta
$BODY$
  LANGUAGE sql VOLATILE
  COST 100

我想从对象中删除键,以防 valDelta = '__delete__'。

非常感谢任何帮助,谢谢! :)

【问题讨论】:

    标签: sql json postgresql plpgsql


    【解决方案1】:

    目前"__deleted__" 让您在 PostgreSQL 中的一些解析机制上遇到麻烦。我建议使用NULL 来表示已删除的值。话虽如此,您可以将函数简化为:

    CREATE OR REPLACE FUNCTION "public"."jsonb_merge"("orig" jsonb, "delta" jsonb)
        RETURNS "pg_catalog"."jsonb" AS
        $$
          SELECT jsonb_strip_nulls($1 || $2);
        $$
        LANGUAGE SQL IMMUTABLE;
    

    || 运算符将两个 JSONB 对象连接在一起,并为右侧的任何键值对提供首选项。 jsonb_strip_nulls 函数将删除与它们关联的 null 值的所有键(注意:JSONB is treated differently than a SQL NULL 中的 null,因此在 JSONB null 上进行 IS NULL/IS NOT NULL 测试不会工作)。

    这不处理嵌套的 JSON 对象,但如果您只有顶级键值对就足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 2017-05-02
      • 2015-07-12
      • 2011-12-02
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多