【问题标题】:Postgres: Expand JSON column into rowsPostgres:将 JSON 列展开为行
【发布时间】:2014-11-16 16:48:42
【问题描述】:

在 Postgres 9.3 数据库中,我有一个表,其中一列包含 JSON,如下例所示的测试表所示。

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 始终是一个包含可变数量哈希的数组。每个散列始终具有相同的键集。我正在尝试编写一个查询,该查询为 JSON 数组中的每个条目返回一行,每个哈希键的列和 things 表中的 id。我希望输出如下:

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

即JSON 数组中包含两个项目的条目的两行。是否有可能让 Postgres 做到这一点? json_populate_recordset 感觉像是答案的重要组成部分,但我不能让它同时处理多行。

【问题讨论】:

    标签: sql json postgresql


    【解决方案1】:
    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
    

    【讨论】:

      猜你喜欢
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 2023-03-27
      • 2013-11-18
      • 1970-01-01
      • 2018-05-19
      • 2018-07-26
      相关资源
      最近更新 更多