首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在postgresql (10.3)中在单独的行和列中取消嵌套和插入json数据

在postgresql (10.3)中在单独的行和列中取消嵌套和插入json数据
EN

Stack Overflow用户
提问于 2018-06-09 19:17:37
回答 1查看 59关注 0票数 1

我有以下数据集:

代码语言:javascript
复制
{"date":{"year":2017,"month":7,"day":2},"data":{"param1":[10,20,30,440],"param2":[55,65,75,85],"param3":[43,55,71,72]}}

我从一个名为rawData的表中检索数据。

现在,我想要取消数组中的值的嵌套,并将它们放在另一个表(seperateData)中的4个单独的行和列中,因此对于这个示例,它将如下所示:

代码语言:javascript
复制
year  | month | day | param1 | param2 | param3

2017      7      2      10       55       43
2017      7      2      20       65       55
2017      7      2      30       75       71
2017      7      2      440      85       72

我猜我必须使用unnest和ordinality来实现这一点,但我被困在了应该如何进行的问题上。数组param1、param2、param3的长度始终相同。

我已经摆弄了一下数据:https://www.db-fiddle.com/f/jZhYLEvdSERzLCDyoAJz65/0

EN

回答 1

Stack Overflow用户

发布于 2018-06-09 20:43:04

适当地,不是最好的方法,我的PostgreSQL体验不是很好,但它很有效。

查询

代码语言:javascript
复制
  SELECT   
      ((rawData.values)::json->'date')::json->'year' AS year
    , ((rawData.values)::json->'date')::json->'month' AS month
    , ((rawData.values)::json->'date')::json->'day' AS day  
    , JSON_ARRAY_ELEMENTS(((rawData.values)::json->'data')::json->'param1') AS param1
    , JSON_ARRAY_ELEMENTS(((rawData.values)::json->'data')::json->'param2') AS param2   
    , JSON_ARRAY_ELEMENTS(((rawData.values)::json->'data')::json->'param3') AS param3
  FROM
   rawData

演示https://www.db-fiddle.com/f/jZhYLEvdSERzLCDyoAJz65/1

当数组param1、param2和param3的长度不相等时,查询也会起作用。

演示https://www.db-fiddle.com/f/jZhYLEvdSERzLCDyoAJz65/4

感谢你的回答,到目前为止,它是有效的。我唯一忘记的是,我实际上也需要索引作为一个单独的列。所以数组元素的索引。有什么想法吗?

通过将GENERATE_SERIES与JSON_ARRAY_LENGTH结合使用,这是可能的

查询

代码语言:javascript
复制
  SELECT   
      ((rawData.values)::json->'date')::json->'year' AS year
    , ((rawData.values)::json->'date')::json->'month' AS month
    , ((rawData.values)::json->'date')::json->'day' AS day  
    , JSON_ARRAY_ELEMENTS(((rawData.values)::json->'data')::json->'param1') AS param1
    , GENERATE_SERIES(1, JSON_ARRAY_LENGTH(((rawData.values)::json->'data')::json->'param1')) AS param1_array_index
    , JSON_ARRAY_ELEMENTS(((rawData.values)::json->'data')::json->'param2') AS param2   
    , GENERATE_SERIES(1, JSON_ARRAY_LENGTH(((rawData.values)::json->'data')::json->'param2')) AS param2_array_index    
    , JSON_ARRAY_ELEMENTS(((rawData.values)::json->'data')::json->'param3') AS param3
    , GENERATE_SERIES(1, JSON_ARRAY_LENGTH(((rawData.values)::json->'data')::json->'param3')) AS param3_array_index        
  FROM
   rawData

请参阅演示https://www.db-fiddle.com/f/jZhYLEvdSERzLCDyoAJz65/6

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50773693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档