sql >> Base de Datos >  >> RDS >> PostgreSQL

Eliminar un valor no único de una matriz

Basado en mi antigua respuesta en dba.SE que encontraste y le diste un buen uso:

Puede ir un paso más allá:

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 función toma como 2º parámetro el valor del elemento a eliminar. Usando el pseudo-tipo polimórfico anyelement en consecuencia para que esto funcione para cualquier tipo de matriz.

Entonces el UPDATE simplemente es:

UPDATE test_table
SET    test_array = f_array_remove_elem1(test_array, 'B')
WHERE  id = 1;

db<>fiddle aquí

Mientras uso mi función original f_array_remove_elem() que toma la posición del índice en lugar del valor del elemento, podría prescindir de una subconsulta:

UPDATE test_table
SET    test_array = f_array_remove_elem(test_array, array_position(test_array, 'B'))
WHERE  id = 1;

Incluso podría ser un poco más rápido que mi nueva función.
Y tenga en cuenta que la versión más simple en la parte inferior de mi respuesta anterior funciona para Postgres 9.6.