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.