Helpex - Trao đổi & giúp đỡ Đăng nhập

Thêm (đẩy) và xóa khỏi mảng JSON trong PostgreSQL 9.2, 9.3 và 9.4?

Bùi Diễm Phúc
· 11:03 08/06/2015
5 ngày trước

Đối với các phiên bản lớn hơn 9.5, hãy xem câu hỏi này

Tôi đã tạo một bảng trong PostgreSQL bằng cách sử dụng:

CREATE TEMP TABLE jsontesting
AS
  SELECT id, jsondata::jsonb FROM ( VALUES
    (1, '["abra","value","mango", "apple", "sample"]'),
    (2, '["japan","china","india", "russia", "australia"]'),
    (3, '["must", "match"]'),
    (4, '["abra","value","true", "apple", "sample"]'),
    (5, '["abra","false","mango", "apple", "sample"]'),
    (6, '["string","value","mango", "apple", "sample"]'),
    (7, '["must", "watch"]')
  ) AS t(id,jsondata);

Bây giờ những gì tôi muốn là

  • add Một cái gì đó như append_to_json_array lấy trong jsondata thực tế là một mảng json và chuỗi newString mà tôi phải thêm vào mảng jsondata đó và hàm này sẽ trả về mảng json đã cập nhật.

    UPDATE jsontesting
    SET jsondata=append_to_json_array(jsondata, 'newString')
    WHERE id = 7;
    
  • xóa một giá trị khỏi mảng dữ liệu json, một hàm để xóa giá trị.

Tôi đã cố gắng tìm kiếm tài liệu của postgreSQL nhưng không tìm thấy gì ở đó.

8 hữu ích 2 bình luận 5.7k xem chia sẻ
Phan Thành Ý
· 20:28 08/06/2015
20:28:41 08/06/2015

Ý tưởng của Radek có thể được sử dụng để xác định các chức năng tiện dụng này:

create function jsonb_array_append(j jsonb, e text)
returns jsonb language sql immutable
as $$
    select array_to_json(array_append(array(select * from jsonb_array_elements_text(j)), e))::jsonb 
$$;

create function jsonb_array_remove(j jsonb, e text)
returns jsonb language sql immutable
as $$
    select array_to_json(array_remove(array(select * from jsonb_array_elements_text(j)), e))::jsonb 
$$;

create function jsonb_array_replace(j jsonb, e1 text, e2 text)
returns jsonb language sql immutable
as $$
    select array_to_json(array_replace(array(select * from jsonb_array_elements_text(j)), e1, e2))::jsonb 
$$;

Các chức năng đang hoạt động:

select jsonb_array_append('["alfa", "beta", "gamma"]', 'delta');
         jsonb_array_append
------------------------------------
 ["alfa", "beta", "gamma", "delta"]

select jsonb_array_remove('["alfa", "beta", "gamma"]', 'beta');
 jsonb_array_remove
-------------------
 ["alfa", "gamma"]

select jsonb_array_replace('["alfa", "beta", "gamma"]', 'alfa', 'delta');
     jsonb_array_replace
----------------------------
 ["delta", "beta", "gamma"]

Nếu chúng tỏ ra hữu ích cho bạn, hãy đánh giá cao câu trả lời của Radek. Tuy nhiên, tôi phải nói thêm rằng tôi hoàn toàn đồng ý với nhận xét của a_horse.

5 hữu ích 1 bình luận chia sẻ
Bùi Hương Trang
· 16:12 08/06/2015
16:12:20 08/06/2015

Thêm vào:

update jsontesting 
set jsondata = array_to_json(array(select * from jsonb_array_elements_text(jsondata)) || 'newString'::text)::jsonb 
where id = 7;

Để loại bỏ:

update jsontesting 
set jsondata = array_to_json(array_remove(array(select * from jsonb_array_elements_text(jsondata)), 'toRemove'))::jsonb 
where id = 7;
4 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ arrays json postgresql postgresql-9.4 jsonb , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm