如何删除 PostgreSQL 中具有特定值的所有 JSON 属性
How to remove all JSON attributes with certain value in PostgreSQL
鉴于此 table
parent
payload
1
{ a: 7, b: 3 }
2
{ a: 7, c: 3 }
1
{ d: 3, e: 1, f: 3 }
我想更新 1
的子项并删除任何属性 X
,其中 payload->X
是 3
。
执行查询后,记录应如下所示:
parent
payload
1
{ a: 7 }
2
{ a: 7, c: 3 }
1
{ e: 1 }
update records set payload=?? where parent = 1 and ??
这个没有内置函数,但是你可以自己写:
create function remove_keys_by_value(p_input jsonb, p_value jsonb)
returns jsonb
as
$$
select jsonb_object_agg(t.key, t.value)
from jsonb_each(p_input) as t(key, value)
where value <> p_value;
$$
language sql
immutable;
那么你可以这样做:
update records
set payload = remove_key_by_value(payload, to_jsonb(3))
where parent = 1;
这假设 payload
被定义为 jsonb
(它应该是)。如果不是,则必须强制转换它:payload::jsonb
试试这个
update records
set payload = payload - 'x'
where parent = 1 and payload->>'x'::int = 3
鉴于此 table
parent | payload |
---|---|
1 | { a: 7, b: 3 } |
2 | { a: 7, c: 3 } |
1 | { d: 3, e: 1, f: 3 } |
我想更新 1
的子项并删除任何属性 X
,其中 payload->X
是 3
。
执行查询后,记录应如下所示:
parent | payload |
---|---|
1 | { a: 7 } |
2 | { a: 7, c: 3 } |
1 | { e: 1 } |
update records set payload=?? where parent = 1 and ??
这个没有内置函数,但是你可以自己写:
create function remove_keys_by_value(p_input jsonb, p_value jsonb)
returns jsonb
as
$$
select jsonb_object_agg(t.key, t.value)
from jsonb_each(p_input) as t(key, value)
where value <> p_value;
$$
language sql
immutable;
那么你可以这样做:
update records
set payload = remove_key_by_value(payload, to_jsonb(3))
where parent = 1;
这假设 payload
被定义为 jsonb
(它应该是)。如果不是,则必须强制转换它:payload::jsonb
试试这个
update records
set payload = payload - 'x'
where parent = 1 and payload->>'x'::int = 3