2015-01-08 20 views
6

Tôi đã tìm kiếm khá nhiều về điều này và vẫn không trả lời được. Tôi đang sử dụng PostgreSQL. Tên cột là "các phần" và loại cột là json [] trong ví dụ bên dưới.Cách lấy các phần tử từ mảng Json trong PostgreSQL

cột của tôi trông như thế này trong cơ sở dữ liệu:

sections 
[{"name"  : "section1", 
    "attributes": [{"attrkey1": "value1", 
        "attrkey2": "value2"}, 

       {"attrkey3": "value3", 
        "attrkey4": "value4"}] 
}, 
{"name"  : "section2", 
    "attributes": [{"attrkey3": "value5", 
        "attrkey6": "value6"}, 

       {"attrkey1": "value7", 
        "attrkey8": "value8"}] 
}] 

Đó là mảng json và tôi muốn để có được "attrkey3" trong kết quả của tôi. Để nhận được khóa đặc biệt từ Json, tôi có thể sử dụng json_extract_path_text(json_column, 'json_property') đang hoạt động hoàn toàn tốt. Nhưng tôi không có ý tưởng làm thế nào để có được một số tài sản từ json [].

Nếu tôi nói về ví dụ trên, tôi muốn nhận giá trị của thuộc tính "attrkey2" được hiển thị trong kết quả của tôi. Tôi biết đó là một mảng để nó có thể hoạt động khác với bình thường, ví dụ: tất cả các giá trị của mảng của tôi sẽ hoạt động như một hàng khác vì vậy tôi có thể phải viết truy vấn phụ nhưng không biết làm thế nào để thực hiện nó.

Ngoài ra, tôi không thể viết chỉ mục tĩnh và nhận thuộc tính của phần tử json từ một số chỉ mục cụ thể. Truy vấn của tôi sẽ được tạo động vì vậy tôi sẽ không bao giờ biết có bao nhiêu phần tử nằm trong mảng json.

Tôi đã xem một số ví dụ tĩnh nhưng không biết cách triển khai nó trong trường hợp của mình. Ai đó có thể cho tôi biết làm thế nào để làm điều này trong truy vấn?

+0

Tôi không chắc chắn rằng bạn có cột 'json []' (giá trị mảng PostgreSQL của cột 'json'), hoặc cột được nhập« json', có vẻ là một mảng JSON (như trong ví dụ của bạn). Vui lòng làm rõ. – pozs

Trả lời

8

Tôi không chắc chắn bạn có một (mảng PostgreSQL của json giá trị) json[] gõ cột, hoặc một cột json gõ, đó dường như là một mảng JSON (như trong ví dụ của bạn).

Hoặc là trường hợp, bạn cần mở rộng mảng của mình trước khi truy vấn. Trong trường hợp json[], bạn cần sử dụng unnest(anyarray); trong trường hợp mảng JSON trong một cột json đánh máy, bạn cần phải sử dụng json_array_elements(json) (và LATERAL tham gia - họ là tiềm ẩn trong các ví dụ của tôi):

select  t.id, 
      each_section ->> 'name' section_name, 
      each_attribute ->> 'attrkey3' attrkey3 
from  t 
cross join unnest(array_of_json) each_section 
cross join json_array_elements(each_section -> 'attributes') each_attribute 
where  (each_attribute -> 'attrkey3') is not null; 
-- use "where each_attribute ? 'attrkey3'" in case of jsonb 


select  t.id, 
      each_section ->> 'name' section_name, 
      each_attribute ->> 'attrkey3' attrkey3 
from  t 
cross join json_array_elements(json_array) each_section 
cross join json_array_elements(each_section -> 'attributes') each_attribute 
where  (each_attribute -> 'attrkey3') is not null; 

SQLFiddle

Thật không may, bạn không thể sử dụng bất kỳ chỉ số với dữ liệu của bạn. Trước tiên, bạn cần phải sửa lược đồ của mình để thực hiện điều đó.

+0

Hoàn hảo !! Đó là những gì tôi đã mong muốn. Mã của bạn trong SQLFiddle là hoàn hảo. Cảm ơn bạn đã giải quyết vấn đề của tôi. –

1

Và cũng có thể, nếu có một dữ liệu bản đồ giá trị quan trọng trong array:

select each_data -> 'value' as value3 
from t cross join jsonb_array_elements(t.sections -> 'attributes') each_attribute 
where each_attribute -> 'key' = '"attrkey3"' 

Tôi nhắc đến điều này bởi vì câu trả lời lớn cũng cung cấp một giải pháp hoàn hảo cho trường hợp của tôi. Nhân tiện, hãy lưu ý phương thức jsonb_array .. cho thuộc tính loại jsonb.

Các vấn đề liên quan