Basierend auf meiner alten Antwort auf dba.SE, die Sie gefunden und sinnvoll genutzt haben:
Sie könnten noch einen Schritt weiter gehen:
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';
Diese Funktion nimmt den Wert des zu entfernenden Elements als zweiten Parameter. Verwendung des polymorphen Pseudotyps anyelement
entsprechend, damit dies für jeden Array-Typ funktioniert.
Dann das UPDATE
ist einfach:
UPDATE test_table
SET test_array = f_array_remove_elem1(test_array, 'B')
WHERE id = 1;
db<>fiddle hier
Während ich meine ursprüngliche Funktion f_array_remove_elem()
verwende die anstelle des Elementwertes die Indexposition übernimmt, könnten Sie auf eine Unterabfrage verzichten:
UPDATE test_table
SET test_array = f_array_remove_elem(test_array, array_position(test_array, 'B'))
WHERE id = 1;
Könnte sogar etwas schneller sein als meine neue Funktion.
Und beachten Sie, dass die einfachere Version am Ende meiner alten Antwort für Postgres 9.6 funktioniert.