Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在postgresql(10.3)中,在单独的行和列中取消测试和插入json数据_Postgresql_Postgresql 10 - Fatal编程技术网

在postgresql(10.3)中,在单独的行和列中取消测试和插入json数据

在postgresql(10.3)中,在单独的行和列中取消测试和插入json数据,postgresql,postgresql-10,Postgresql,Postgresql 10,我有以下数据集: {"date":{"year":2017,"month":7,"day":2},"data":{"param1":[10,20,30,440],"param2":[55,65,75,85],"param3":[43,55,71,72]}} 我从一个名为rawData的表中检索数据 现在,我想取消数组中的值,并将它们放在另一个表(SeparateData)中的4个单独的行和列中,因此在本例中,它看起来像: year | month | day | param1 | param

我有以下数据集:

{"date":{"year":2017,"month":7,"day":2},"data":{"param1":[10,20,30,440],"param2":[55,65,75,85],"param3":[43,55,71,72]}}
我从一个名为rawData的表中检索数据

现在,我想取消数组中的值,并将它们放在另一个表(SeparateData)中的4个单独的行和列中,因此在本例中,它看起来像:

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
我猜我必须使用最不寻常的方式来实现这一点,但我仍在思考应该如何继续。数组param1、param2、param3的长度始终相同

我已经对数据进行了修改:

正确地说,这不是最好的方法。我的PostgreSQL体验不是很好,但很有效

查询

  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
  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
演示

当数组param1、param2、param3的长度不相等时,查询也可以工作

演示


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

这可以通过GENERATE_SERIES与JSON_ARRAY_LENGTH结合使用

查询

  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
  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

请参见演示

您使用的PostgreSQL版本是什么?@RaymondNijland我使用的是10.3版谢谢您的回答,目前为止它还可以使用。我唯一忘记的是,我实际上也需要索引作为一个单独的列。所以数组元素的索引。有什么想法吗?“谢谢你的回答,到目前为止它很有效。我唯一忘记的是,我实际上也需要索引作为一个单独的列。所以数组元素的索引。有什么想法吗?”@web_student我已经更新了我的答案。。您可能需要将
GENERATE_SERIES(1,…)
更改为
GENERATE_SERIES(0,…)
,因为数组索引通常以0开头