あなたが見つけてうまく利用したdba.SEに関する私の古い答えに基づく:
あなたはそれをさらに一歩進めるかもしれません:
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';
この関数は、削除する要素の値を2番目のパラメーターとして受け取ります。多形疑似タイプanyelement
の使用 したがって、これを任意の配列タイプで機能させることができます。
次に、UPDATE
単純に:
UPDATE test_table
SET test_array = f_array_remove_elem1(test_array, 'B')
WHERE id = 1;
db <> fiddle こちら
元の関数f_array_remove_elem()
を使用している間 要素値の代わりにインデックス位置を取得する場合、サブクエリなしで実行できます:
UPDATE test_table
SET test_array = f_array_remove_elem(test_array, array_position(test_array, 'B'))
WHERE id = 1;
新しい関数よりも少し速いかもしれません。
そして、古い回答の下部にある単純なバージョンがPostgres9.6で機能することに注意してください。