Nếu bạn có thể nâng cấp lên Postgresql 9.5, jsonb_set
lệnh có sẵn, như những người khác đã đề cập.
Trong mỗi câu lệnh SQL sau, tôi đã bỏ qua where
mệnh đề ngắn gọn; rõ ràng là bạn muốn thêm nó trở lại.
Cập nhật tên:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Thay thế các thẻ (trái ngược với việc thêm hoặc xóa các thẻ):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Thay thế thẻ thứ hai (được lập chỉ mục 0):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Nối thẻ ( điều này sẽ hoạt động miễn là có ít hơn 999 thẻ; việc thay đổi đối số 999 thành 1000 hoặc cao hơn sẽ tạo ra lỗi . Điều này dường như không còn xảy ra trong Postgres 9.5.3; một chỉ mục lớn hơn nhiều có thể được sử dụng):
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Xóa thẻ cuối cùng:
UPDATE test SET data = data #- '{tags,-1}'
Cập nhật phức tạp (xóa thẻ cuối cùng, chèn thẻ mới và thay đổi tên):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
Điều quan trọng cần lưu ý là trong mỗi ví dụ này, bạn không thực sự cập nhật một trường dữ liệu JSON. Thay vào đó, bạn đang tạo phiên bản tạm thời, được sửa đổi của dữ liệu và gán lại phiên bản đã sửa đổi đó cho cột. Trên thực tế, kết quả sẽ giống nhau, nhưng hãy ghi nhớ điều này sẽ giúp các cập nhật phức tạp, như ví dụ cuối cùng, dễ hiểu hơn.
Trong ví dụ phức tạp, có ba phép biến đổi và ba phiên bản tạm thời:Đầu tiên, thẻ cuối cùng bị xóa. Sau đó, phiên bản đó được chuyển đổi bằng cách thêm một thẻ mới. Tiếp theo, phiên bản thứ hai được chuyển đổi bằng cách thay đổi tên name
đồng ruộng. Giá trị trong data
được thay thế bằng phiên bản cuối cùng.