The || operator for the jsonb type has a surprising behaviour. Instead of appending the right operand "as is" to the left operand, it has a magic behaviour if the right operand is an array, in which case it will append the items of the array, instead of appending the array itself as a single value.
Example: SELECT '[10,20]'::jsonb || '30'::jsonb; [10, 20, 30] SELECT '[10,20]'::jsonb || '[30]'::jsonb; [10, 20, 30] Since [10, 20, [30]] is desired in our case, we must use jsonb_insert() to work-around the problem in a not very nice way: SELECT jsonb_insert('[10,20]'::jsonb,'{-1}','[30]'::jsonb,TRUE); [10, 20, [30]] Suggestions welcome if there is a better way to solve this problem. Best regards, Joel