Com base na minha resposta antiga no dba.SE que você encontrou e aproveitou:
Você pode dar um passo adiante:
CREATE OR REPLACE FUNCTION f_array_remove_elem1(anyarray, anyelement)
RETURNS anyarray LANGUAGE sql IMMUTABLE AS
'SELECT $1[:idx-1] || $1[idx+1:] FROM array_position($1, $2) idx';
Esta função recebe o valor do elemento a ser removido como 2º parâmetro. Usando o pseudotipo polimórfico
anyelement
de acordo para fazer isso funcionar para qualquer tipo de matriz. Em seguida, o
UPDATE
simplesmente é:UPDATE test_table
SET test_array = f_array_remove_elem1(test_array, 'B')
WHERE id = 1;
db<>fiddle aqui
Ao usar minha função original
f_array_remove_elem()
que assume a posição do índice em vez do valor do elemento, você pode fazer sem uma subconsulta:UPDATE test_table
SET test_array = f_array_remove_elem(test_array, array_position(test_array, 'B'))
WHERE id = 1;
Pode até ser um pouco mais rápido que minha nova função.
E observe que a versão mais simples na parte inferior da minha resposta antiga funciona para o Postgres 9.6.