PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Supprimer une valeur non unique d'un tableau

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.