Basado en mi antigua respuesta en dba.SE que encontraste y le diste un buen uso:
Puede ir un paso más allá:
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 función toma como 2º parámetro el valor del elemento a eliminar. Usando el pseudo-tipo polimórfico anyelement
en consecuencia para que esto funcione para cualquier tipo de matriz.
Entonces el UPDATE
simplemente es:
UPDATE test_table
SET test_array = f_array_remove_elem1(test_array, 'B')
WHERE id = 1;
db<>fiddle aquí
Mientras uso mi función original f_array_remove_elem()
que toma la posición del índice en lugar del valor del elemento, podría prescindir de una subconsulta:
UPDATE test_table
SET test_array = f_array_remove_elem(test_array, array_position(test_array, 'B'))
WHERE id = 1;
Incluso podría ser un poco más rápido que mi nueva función.
Y tenga en cuenta que la versión más simple en la parte inferior de mi respuesta anterior funciona para Postgres 9.6.