Sulla base della mia vecchia risposta su dba.SE che hai trovato e fatto buon uso:
Potresti fare un ulteriore passo avanti:
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';
Questa funzione prende il valore dell'elemento da rimuovere come 2° parametro. Usando lo pseudo-tipo polimorfico anyelement
di conseguenza per farlo funzionare per qualsiasi tipo di array.
Quindi il UPDATE
è semplicemente:
UPDATE test_table
SET test_array = f_array_remove_elem1(test_array, 'B')
WHERE id = 1;
db<>violino qui
Durante l'utilizzo della mia funzione originale f_array_remove_elem()
che prende la posizione dell'indice invece del valore dell'elemento, potresti fare a meno di una sottoquery:
UPDATE test_table
SET test_array = f_array_remove_elem(test_array, array_position(test_array, 'B'))
WHERE id = 1;
Potrebbe anche essere un po' più veloce della mia nuova funzione.
E nota che la versione più semplice in fondo alla mia vecchia risposta funziona per Postgres 9.6.