Dựa trên câu trả lời cũ của tôi trên dba.SE mà bạn đã tìm thấy và sử dụng tốt:
Bạn có thể tiến thêm một bước nữa:
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';
Hàm này nhận giá trị của phần tử cần loại bỏ làm tham số thứ 2. Sử dụng anyelement
kiểu giả đa hình phù hợp để làm cho điều này hoạt động cho bất kỳ loại mảng nào.
Sau đó, UPDATE
đơn giản là:
UPDATE test_table
SET test_array = f_array_remove_elem1(test_array, 'B')
WHERE id = 1;
db <> fiddle tại đây
Trong khi sử dụng hàm gốc của tôi f_array_remove_elem()
lấy vị trí chỉ mục thay vì giá trị phần tử, bạn có thể thực hiện mà không cần truy vấn con:
UPDATE test_table
SET test_array = f_array_remove_elem(test_array, array_position(test_array, 'B'))
WHERE id = 1;
Thậm chí có thể nhanh hơn một chút so với chức năng mới của tôi.
Và lưu ý rằng phiên bản đơn giản hơn ở cuối câu trả lời cũ của tôi hoạt động cho Postgres 9.6.