【问题标题】:Convert json object to recordset?将json对象转换为记录集?
【发布时间】:2018-11-13 19:40:44
【问题描述】:

使用 Postgres 11,我如何转换这个 JSON 对象(以文本索引和整数作为值)

{"a":{"col1":1,"col2":2,"col3":3}
,"b":{"col1":4,"col2":5,"col3":6}
,"c":{"col1":7,"col2":8,"col3":9}}

到如下记录集:

r_id | col1 | col2 | col3
-------------------------
   a |    1 |    2 |    3
   b |    4 |    5 |    6
   c |    7 |    8 |    9

【问题讨论】:

  • 您的 Postgres 版本?确切的源和目标数据类型?是否存在具有该确切目标行类型的表、视图或类似内容?
  • 更新了版本和目标数据类型。没有具有该行类型的表、视图或类似内容。

标签: json postgresql type-conversion


【解决方案1】:

Your solution 似乎只适用于三个值列。

如果列更多,json_populate_record() 会缩短语法并使其更快一些。但是,它建立在您没有的模板行类型之上。您可以通过创建一个临时表轻松地提供它(在会话结束之前在会话中可见):

CREATE TEMP TABLE t1(col1 int, col2 int, col3 int);

SELECT key AS r_id, (json_populate_record(null::t1, value)).*
FROM json_each('{"a":{"col1":1,"col2":2,"col3":3}
               , "b":{"col1":4,"col2":5,"col3":6}
               , "c":{"col1":7,"col2":8,"col3":9}}')

如果您的 JSON 文档是一个记录数组,您可以使用 json_populate_recordset():

CREATE TEMP TABLE t2(r_id text, col1 int, col2 int, col3 int);

SELECT *
FROM   json_populate_recordset(null::t2
             , '[{"r_id":"a","col1":1,"col2":2,"col3":3}
               , {"r_id":"b","col1":4,"col2":5,"col3":6}
               , {"r_id":"c","col1":7,"col2":8,"col3":9}]');

【讨论】:

    【解决方案2】:
    SELECT key AS r_id, value->>'col1' AS col1, value->>'col2' AS col2, value->>'col3' AS col3
    FROM JSON_EACH('{"a":{"col1":1,"col2":2,"col3":3},"b":{"col1":4,"col2":5,"col3":6},"c":{"col1":7,"col2":8,"col3":9}}');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 2017-01-03
      相关资源
      最近更新 更多