Postgres:在递归合并函数中删除 jsonb 键
Posted
技术标签:
【中文标题】Postgres:在递归合并函数中删除 jsonb 键【英文标题】:Postgres: Delete a jsonb key, in a recursive merging function 【发布时间】:2018-11-04 20:16:12 【问题描述】:在将值设置为“__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__'。
非常感谢任何帮助,谢谢! :)
【问题讨论】:
【参考方案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 对象,但如果您只有***键值对就足够了。
【讨论】:
以上是关于Postgres:在递归合并函数中删除 jsonb 键的主要内容,如果未能解决你的问题,请参考以下文章
用递归或函数替换 SELECT 中的迭代 INSERT 以遍历 Postgres 中的路径