2014-09-22 21 views
5

Trong cơ sở dữ liệu Postgres 9.3 Tôi có một bảng trong đó một cột chứa JSON, như trong bảng thử nghiệm được hiển thị trong ví dụ bên dưới.Postgres: Mở rộng cột JSON thành các hàng

test=# create table things (id serial PRIMARY KEY, details json, other_field text); 
CREATE TABLE 
test=# \d things 
          Table "public.things" 
    Column | Type |      Modifiers 
-------------+---------+----------------------------------------------------- 
id   | integer | not null default nextval('things_id_seq'::regclass) 
details  | json | 
other_field | text | 
Indexes: 
    "things_pkey" PRIMARY KEY, btree (id) 

test=# insert into things (details, other_field) 
     values ('[{"json1": 123, "json2": 456},{"json1": 124, "json2": 457}]', 'nonsense'); 
INSERT 0 1 
test=# insert into things (details, other_field) 
     values ('[{"json1": 234, "json2": 567}]', 'piffle'); 
INSERT 0 1 
test=# select * from things; 
id |       details       | other_field 
----+-------------------------------------------------------------+------------- 
    1 | [{"json1": 123, "json2": 456},{"json1": 124, "json2": 457}] | nonsense 
    2 | [{"json1": 234, "json2": 567}]        | piffle 
(2 rows) 

JSON luôn là mảng chứa số lượng băm thay đổi. Mỗi băm luôn có cùng một bộ khóa. Tôi đang cố gắng để viết một truy vấn mà trả về một hàng cho mỗi mục trong mảng JSON, với các cột cho mỗi khóa băm và id từ bảng điều. Tôi hy vọng sản lượng như sau:

thing_id | json1 | json2 
----------+-------+------- 
     1 | 123 | 456 
     1 | 124 | 457 
     2 | 234 | 567 

tức là hai hàng cho các mục có hai mục trong mảng JSON. Có thể nhận được Postgres để làm điều này? json_populate_recordset giống như một phần quan trọng của câu trả lời, nhưng tôi không thể làm cho nó hoạt động với nhiều hơn một hàng cùng một lúc.

Trả lời

6
select id, 
    (details ->> 'json1')::int as json1, 
    (details ->> 'json2')::int as json2 
from (
    select id, json_array_elements(details) as details 
    from things 
) s 
; 
id | json1 | json2 
----+-------+------- 
    1 | 123 | 456 
    1 | 124 | 457 
    2 | 234 | 567 
Các vấn đề liên quan