Въз основа на моя стар отговор на dba.SE, който намерихте и използвахте добре:
Може да направите една крачка напред:
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';
Тази функция приема стойността на елемента за премахване като втори параметър. Използване на полиморфния псевдотип anyelement
съответно, за да работи това за всеки тип масив.
След това UPDATE
просто е:
UPDATE test_table
SET test_array = f_array_remove_elem1(test_array, 'B')
WHERE id = 1;
db<>fiddle тук
Докато използвах оригиналната си функция f_array_remove_elem()
който заема позицията на индекса вместо стойността на елемента, можете да направите без подзаявка:
UPDATE test_table
SET test_array = f_array_remove_elem(test_array, array_position(test_array, 'B'))
WHERE id = 1;
Може дори да е малко по-бързо от новата ми функция.
И имайте предвид, че по-опростената версия в долната част на стария ми отговор работи за Postgres 9.6.