Gebaseerd op mijn oude antwoord op dba.SE dat je hebt gevonden en goed hebt gebruikt:
Je zou nog een stap verder kunnen gaan:
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';
Deze functie neemt de waarde van het te verwijderen element als 2e parameter. Het polymorfe pseudo-type anyelement
gebruiken dienovereenkomstig om dit voor elk type array te laten werken.
Dan de UPDATE
is gewoon:
UPDATE test_table
SET test_array = f_array_remove_elem1(test_array, 'B')
WHERE id = 1;
db<>fiddle hier
Tijdens het gebruik van mijn originele functie f_array_remove_elem()
die de indexpositie inneemt in plaats van de elementwaarde, zou je zonder een subquery kunnen doen:
UPDATE test_table
SET test_array = f_array_remove_elem(test_array, array_position(test_array, 'B'))
WHERE id = 1;
Misschien zelfs een beetje sneller dan mijn nieuwe functie.
En merk op dat de eenvoudigere versie onderaan mijn oude antwoord werkt voor Postgres 9.6.