sql >> Databasteknik >  >> RDS >> PostgreSQL

Ta bort ett, icke-unikt värde från en array

Baserat på mitt gamla svar på dba.SE som du hittade och använde:

Du kan ta det ett steg längre:

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';

Denna funktion tar värdet på det element som ska tas bort som andra parameter. Använder den polymorfa pseudotypen anyelement följaktligen för att få detta att fungera för alla arraytyper.

Sedan UPDATE är helt enkelt:

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

db<>fiol här

Medan jag använder min ursprungliga funktion f_array_remove_elem() som tar indexpositionen istället för elementvärdet, kan du göra utan en underfråga:

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

Kan till och med vara lite snabbare än min nya funktion.
Och observera att den enklare versionen längst ner i mitt gamla svar fungerar för Postgres 9.6.



  1. Rails Resque-arbetare misslyckas med PGError:servern stängde anslutningen oväntat

  2. Mac OSX Lion Postgres accepterar inte anslutningar på /tmp/.s.PGSQL.5432

  3. MySql Fulltextsökning

  4. Hur kan jag göra HTTP-förfrågan från SQL-servern?