使用新键更新 jsonb 但如果现有 obj 具有键则保留值
Update jsonb with the new keys but preserve the value if the existing obj has the key
我需要更新现有对象。生成的对象将拥有新对象中的所有键,并且只拥有键,但如果相同的键已经存在,我需要复制该值。
类似于合并,但仅适用于具有相同键的值。
示例:
存在于数据库中:{"a":1,"b":2, "c":3}
,
新对象:{"a":999, "d": 4}
结果:{"a":1, "d":4}
- “a”从现有数据中获取值,“b”消失,添加“d”。
这是我的特殊 'upsert' 查询。到目前为止我所做的很简单:
INSERT ....
ON CONFLICT (project_id, other_stuf)
DO UPDATE SET payload = excluded.payload || answers.payload
但它并没有删除上面示例中的“b”。
想法?
您可以将 jsonb_each
与 jsonb_object_agg
结合使用:
SET payload = (
SELECT jsonb_object_agg(
key,
(CASE WHEN answers.payload ? key THEN answers.payload->key ELSE value)
)
FROM jsonb_each(excluded.payload)
)
或缩写为
SET payload = (
SELECT jsonb_object_agg(key, COALESCE(answers.payload->key, value))
FROM jsonb_each(excluded.payload)
)
我需要更新现有对象。生成的对象将拥有新对象中的所有键,并且只拥有键,但如果相同的键已经存在,我需要复制该值。 类似于合并,但仅适用于具有相同键的值。
示例:
存在于数据库中:{"a":1,"b":2, "c":3}
,
新对象:{"a":999, "d": 4}
结果:{"a":1, "d":4}
- “a”从现有数据中获取值,“b”消失,添加“d”。
这是我的特殊 'upsert' 查询。到目前为止我所做的很简单:
INSERT ....
ON CONFLICT (project_id, other_stuf)
DO UPDATE SET payload = excluded.payload || answers.payload
但它并没有删除上面示例中的“b”。
想法?
您可以将 jsonb_each
与 jsonb_object_agg
结合使用:
SET payload = (
SELECT jsonb_object_agg(
key,
(CASE WHEN answers.payload ? key THEN answers.payload->key ELSE value)
)
FROM jsonb_each(excluded.payload)
)
或缩写为
SET payload = (
SELECT jsonb_object_agg(key, COALESCE(answers.payload->key, value))
FROM jsonb_each(excluded.payload)
)