Удаление и вставка данных json в отдельные строки и столбцы в postgresql (10.3) - PullRequest
0 голосов
/ 09 июня 2018

У меня есть следующий набор данных:

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

Я извлекаю данные из таблицы с именем rawData.

Теперь я хочу развернуть значения внутри массивов и поместить их в 4отдельные строки и столбцы внутри другой таблицы (seperateData), поэтому для этого примера это будет выглядеть так:

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 и порядковый номер, но я застрял в том, как я долженпродолжить.Массивы param1, param2, param3 всегда имеют одинаковую длину.

Я уже сделал скрипку с данными: https://www.db -fiddle.com / f / jZhYLEvdSERzLCDyoAJz65 / 0

1 Ответ

0 голосов
/ 09 июня 2018

Собственно, не лучший способ сделать это с моими возможностями 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

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

Запростакже работает, когда массивы param1, param2, param3 имеют разную длину.

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

Спасибо за ваш ответ, пока работает.Единственное, что я забыл, так это то, что мне нужен индекс как отдельный столбец.Итак, индекс элементов массива.Любая идея

Это возможно с 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
    , 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

...