的Postgres' hstore
扩展名有一个简洁的减法运算符:
hstore - text[]
hstore - hstore
在第一种情况下,它删除了在字符串数组中找到键的键/值对:在第二种情况下,它从第二个hstore中出现的第一个hstore中删除所有匹配的键/值对。 / p>
对于新的jsonb
数据类型,似乎不存在此运算符。有没有简单的方法来执行这些任务?
答案 0 :(得分:2)
关键是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")),
答案 1 :(得分:1)
接受的答案很棒,但是通过检查null也可以改进json - json
案例:
WHERE NOT null_as_value_cmp((this_j->>"key"), (that_j->>"key"))
如果没有NULL
检查,您会获得{}
而不是{"a":1}
:
# select json_subtract('{"a":1, "b":2}'::json, '{"b":2}'::json);
json_subtract
---------------
{}
(1 row)
null_as_value_cmp
就是这样,并将JsNull
表示为数据库NULL
CREATE OR REPLACE FUNCTION null_as_value_cmp(
a text,
b text
)
RETURNS boolean
LANGUAGE sql
IMMUTABLE
CALLED ON NULL INPUT
AS $function$
SELECT CASE
WHEN a IS NULL AND b IS NULL THEN
TRUE
WHEN (a IS NULL AND b IS NOT NULL) THEN
FALSE
WHEN (a IS NOT NULL AND b IS NULL) THEN
FALSE
WHEN a = b THEN
TRUE
ELSE
FALSE
END;
$function$;
[我没有足够的声誉发表评论;在这里不太确定SO协议。]