Функция может выглядеть следующим образом:
create or replace function array_replace_array(anyarray, anyarray, anyarray)
returns anyarray language plpgsql as $$
declare
l1 int = array_length($1, 1);
l2 int = array_length($2, 1);
i int;
begin
for i in 1 .. l1- l2+ 1 loop
if $1[i : i+ l2- 1] = $2 then
return $1[1 : i- 1] || $3 || $1[i+ l2 : l1];
end if;
end loop;
return $1;
end $$;
Примеры:
select
array_replace_array('{A,B,C,D,E}'::text[], '{B,C}', '{X,Y,Z}') as "AXYZDE",
array_replace_array('{A,B,C,D,E}'::text[], '{B,B}', '{X,Y,Z}') as "ABCDE",
array_replace_array('{A,B,C,D,E}'::text[], '{A,B,C,D,E}', '{X,Y,Z}') as "XYZ",
array_replace_array('{1,2,3,4}'::int[], '{2,3}', '{3,2}') as "1324";
AXYZDE | ABCDE | XYZ | 1324
---------------+-------------+---------+-----------
{A,X,Y,Z,D,E} | {A,B,C,D,E} | {X,Y,Z} | {1,3,2,4}
(1 row)