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")),