Baserat på mitt gamla svar på dba.SE som du hittade och använde:
Du kan ta det ett steg längre:
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';
Denna funktion tar värdet på det element som ska tas bort som andra parameter. Använder den polymorfa pseudotypen anyelement
följaktligen för att få detta att fungera för alla arraytyper.
Sedan UPDATE
är helt enkelt:
UPDATE test_table
SET test_array = f_array_remove_elem1(test_array, 'B')
WHERE id = 1;
db<>fiol här
Medan jag använder min ursprungliga funktion f_array_remove_elem()
som tar indexpositionen istället för elementvärdet, kan du göra utan en underfråga:
UPDATE test_table
SET test_array = f_array_remove_elem(test_array, array_position(test_array, 'B'))
WHERE id = 1;
Kan till och med vara lite snabbare än min nya funktion.
Och observera att den enklare versionen längst ner i mitt gamla svar fungerar för Postgres 9.6.