Postgres'hstore扩展有一个简洁的减法运算符:

hstore - text[]

hstore - hstore

在第一种情况下,它删除在字符串数组中找到键的键/值对:在第二种情况下,它从出现在第二个hstore中的第一个hstore中删除所有匹配的键/值对。
这个新的jsonb数据类型似乎不存在这个运算符。有没有一种简单的方法来执行这些任务?

最佳答案

关键是json_each()函数,以及PostgreSQL中手动构建json值的能力。
这里有一个函数可以处理json - text[]

CREATE OR REPLACE FUNCTION "json_object_delete_keys"(
  "json" json,
  VARIADIC "keys_to_delete" TEXT[]
)
  RETURNS json
  LANGUAGE sql
  IMMUTABLE
  STRICT
AS $function$
SELECT COALESCE(
  (SELECT ('{' || string_agg(to_json("key") || ':' || "value", ',') || '}')
     FROM json_each("json")
    WHERE "key" <> ALL ("keys_to_delete")),
  '{}'
)::json
$function$;

要处理json - json情况,只需更改WHERE子句:
    WHERE "json"->>"key" <> ("remove"->>"key")),

10-01 05:12
查看更多