Let us say I have [in Postgres 9.6] a JSONB column named xyz. In an update, I want to set the .foo.bar key of this column to {"done":true}.
But the update must tolerate that the pre-update value for xyz is anything from {} to
{
"abc": "Hello"
}
or maybe
{
"foo": {
"baz": { "done": false }
},
"abc": "Hello"
}
So I cannot use jsonb_set straight away, because it fails if xyz->foo is undefined. In that case I could use jsonb_insert, but that fails if xyz->foo is already defined.
So I try to use concatenation, with something like
jsonb_set(
jsonb_set(xyz, '{foo}', '{}'::jsonb || xyz->'foo', true),
'{foo, bar}', '{"done":true}', true
)
...which also fails when foo is undefined since xyz->'foo' is null which overrides {} in the concatenation.
Obviously I could write a function that uses an if to get around this, but I really feel I should be able to do it in a single update.