PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Remover um valor não exclusivo de uma matriz


Com base na minha resposta antiga no dba.SE que você encontrou e aproveitou:

Você pode dar um passo adiante:
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';

Esta função recebe o valor do elemento a ser removido como 2º parâmetro. Usando o pseudotipo polimórfico anyelement de acordo para fazer isso funcionar para qualquer tipo de matriz.

Em seguida, o UPDATE simplesmente é:
UPDATE test_table
SET    test_array = f_array_remove_elem1(test_array, 'B')
WHERE  id = 1;

db<>fiddle aqui

Ao usar minha função original f_array_remove_elem() que assume a posição do índice em vez do valor do elemento, você pode fazer sem uma subconsulta:
UPDATE test_table
SET    test_array = f_array_remove_elem(test_array, array_position(test_array, 'B'))
WHERE  id = 1;

Pode até ser um pouco mais rápido que minha nova função.
E observe que a versão mais simples na parte inferior da minha resposta antiga funciona para o Postgres 9.6.