PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Rimuovere un valore non univoco da una matrice

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.