Basé sur mon ancienne réponse sur dba.SE que vous avez trouvée et utilisée à bon escient :
Vous pouvez aller plus loin :
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';
Cette fonction prend la valeur de l'élément à supprimer en 2ème paramètre. Utilisation du pseudo-type polymorphe anyelement
en conséquence pour que cela fonctionne pour n'importe quel type de tableau.
Puis le UPDATE
est simplement :
UPDATE test_table
SET test_array = f_array_remove_elem1(test_array, 'B')
WHERE id = 1;
db<>violon ici
Lors de l'utilisation de ma fonction d'origine f_array_remove_elem()
qui prend la position de l'index au lieu de la valeur de l'élément, vous pouvez vous passer d'une sous-requête :
UPDATE test_table
SET test_array = f_array_remove_elem(test_array, array_position(test_array, 'B'))
WHERE id = 1;
Peut-être même un peu plus rapide que ma nouvelle fonction.
Et notez que la version plus simple au bas de mon ancienne réponse fonctionne pour Postgres 9.6.