|| (concatenation)

Purpose: Concatenate two jsonb values. The rule for deriving the output value depends upon the JSON data types of the operands.

Signature:

input values:       jsonb || jsonb
return value:       jsonb

Notes: There is no json overload.

If both sides of the operator are primitive JSON values, then the result is an array of these values:

do $body$
declare
  j_left constant jsonb := '17';
  j_right constant jsonb := '"x"';
  j_expected constant jsonb := '[17, "x"]';
begin
  assert
    j_left || j_right = j_expected,
 'unexpected';
end;
$body$;

If one side is a primitive JSON value and the other is an array , then the result is an array:

do $body$
declare
  j_left constant jsonb := '17';
  j_right constant jsonb := '["x", true]';
  j_expected constant jsonb := '[17, "x", true]';
begin
  assert
    j_left || j_right = j_expected,
 'unexpected';
end;
$body$;

If each side is an object, and no key-value pair in the RHS object has the same key as any key-value pair in the LHS object then the result is an object with all of the key-value pairs present:

do $body$
declare
  j_left constant jsonb := '{"a": 1, "b": 2}';
  j_right constant jsonb := '{"p":17, "q": 19}';
  j_expected constant jsonb := '{"a": 1, "b": 2, "p": 17, "q": 19}';
begin
  assert
    j_left || j_right = j_expected,
 'unexpected';
end;
$body$;

If the key of any key-value pair in the RHS object collides with a key of a key-value pair in the LHS object, then the key-value pair from the RHS object wins, just as when the keys of such pairs collide in a single object:

do $body$
declare
  j_left constant jsonb := '{"a": 1, "b": 2}';
  j_right constant jsonb := '{"p":17, "a": 19}';
  j_expected constant jsonb := '{"a": 19, "b": 2, "p": 17}';
begin
  assert
    j_left || j_right = j_expected,
 'unexpected';
end;
$body$;

If one side is an object and the other is an array, then the object is absorbed as a value in the array:

do $body$
declare
  j_left constant jsonb := '{"a": 1, "b": 2}';
  j_right constant jsonb := '[false, 42, null]';
  j_expected constant jsonb := '[{"a": 1, "b": 2}, false, 42, null]';
begin
  assert
    j_left || j_right = j_expected,
 'unexpected';
end;
$body$;