Cập nhật :cho 9.5+, có những toán tử rõ ràng bạn có thể sử dụng với jsonb
(nếu bạn có json
cột đã nhập, bạn có thể sử dụng phôi để áp dụng sửa đổi):
Xóa khóa (hoặc chỉ mục) khỏi đối tượng JSON (hoặc khỏi mảng) có thể được thực hiện bằng -
nhà điều hành:
SELECT jsonb '{"a":1,"b":2}' - 'a', -- will yield jsonb '{"b":2}'
jsonb '["a",1,"b",2]' - 1 -- will yield jsonb '["a","b",2]'
Có thể thực hiện xóa từ sâu trong hệ thống phân cấp JSON bằng #-
nhà điều hành:
SELECT '{"a":[null,{"b":[3.14]}]}' #- '{a,1,b,0}'
-- will yield jsonb '{"a":[null,{"b":[]}]}'
Đối với 9.4, bạn có thể sử dụng phiên bản đã sửa đổi của câu trả lời gốc (bên dưới), nhưng thay vì tổng hợp một chuỗi JSON, bạn có thể tổng hợp thành một json
đối tượng trực tiếp với json_object_agg()
.
Liên quan:các thao tác JSON khác trong PostgreSQL:
- Làm cách nào để sửa đổi các trường bên trong kiểu dữ liệu PostgreSQL JSON mới?
Câu trả lời ban đầu (áp dụng cho PostgreSQL 9.3):
Nếu bạn có ít nhất PostgreSQL 9.3, bạn có thể chia đối tượng của mình thành từng cặp với json_each()
và lọc các trường không mong muốn của bạn, sau đó tạo lại json theo cách thủ công. Một cái gì đó như:
SELECT data::text::json AS before,
('{' || array_to_string(array_agg(to_json(l.key) || ':' || l.value), ',') || '}')::json AS after
FROM (VALUES ('{"attrA":1,"attrB":true,"attrC":["a","b","c"]}'::json)) AS v(data),
LATERAL (SELECT * FROM json_each(data) WHERE "key" <> 'attrB') AS l
GROUP BY data::text
Với 9.2 (hoặc thấp hơn) thì không thể.
Chỉnh sửa :
Một hình thức thuận tiện hơn là tạo một hàm, hàm này có thể loại bỏ bất kỳ số lượng thuộc tính nào trong json
lĩnh vực:
Chỉnh sửa 2 :string_agg()
rẻ hơn array_to_string(array_agg())
CREATE OR REPLACE FUNCTION "json_object_delete_keys"("json" json, VARIADIC "keys_to_delete" TEXT[])
RETURNS json
LANGUAGE sql
IMMUTABLE
STRICT
AS $function$
SELECT COALESCE(
(SELECT ('{' || string_agg(to_json("key") || ':' || "value", ',') || '}')
FROM json_each("json")
WHERE "key" <> ALL ("keys_to_delete")),
'{}'
)::json
$function$;
Với chức năng này, tất cả những gì bạn cần làm là chạy truy vấn bên dưới:
UPDATE my_table
SET data = json_object_delete_keys(data, 'attrB');