Есть ли способ превратить поле JSON в PostgreSQL в точечный массив?

#postgresql

Вопрос:

В postgresql есть ли способ превратить столбец таблиц, тип которого-JSON, в точечный массив?

 {
  "quote" : {
    "daysRemaining" : "365"
  },
  "estimate" : {
    "coveredEquipment" : {
      "kickerMotorInsurance" : "No",
      "vesselEngineType" : "None/Other",
      "trailerInsurance" : "No",
      "dinghyInsurance" : "No"
    }
  }
}
 

Ожидаемый результат будет:

 {
     "quote.daysRemaining" => "365",
     "estimate.coveredEquipment.vesselEngineType" => "None/Other",
     "estimate.coveredEquipment.trailerInsurance" => "No",
     "estimate.coveredEquipment.kickerMotorInsurance" => "No",
     "estimate.coveredEquipment.dinghyInsurance" => "No"
}
 

Комментарии:

1. Пожалуйста, проясните вашу конкретную проблему или предоставьте дополнительные сведения, чтобы точно указать, что вам нужно. Поскольку это написано в настоящее время, трудно точно сказать, о чем вы просите.

Ответ №1:

Я использовал рекурсивный запрос, чтобы получить ключи json, склеенные точкой, и их связанное значение. Мой запрос может помочь вам получить представление о том, как решить проблему, но я думаю, что это может быть улучшено.

Я использовал json_each() функцию для расширения объекта верхнего уровня JSON в набор пар ключ/значение.

 WITH RECURSIVE q AS (SELECT (json_each(data)).key AS k, (json_each(data)).value AS v 
                      FROM t

                      UNION ALL
                     
                      SELECT k || '.' || (json_each(v)).key AS k, (json_each(v)).value AS v
                      FROM q
                      WHERE json_typeof(v) = 'object'
)

SELECT *
FROM q
WHERE json_typeof(v) != 'object';
 

Выход:

k v
цитата. «365»
оценка.Покрытое оборудование.Страхование kickerMotorInsurance «Нет»
оценка.Оборудование с покрытием.Тип судна «Нет/Другое»
оценка.Оборудование с покрытием.Страхование трейлеров «Нет»
оценка.Покрываемое оборудование.Страхование имущества «Нет»

Или вы можете получить JSON объект:

 WITH RECURSIVE q AS (SELECT (json_each(data)).key AS k, (json_each(data)).value AS v 
                      FROM t

                      UNION ALL
                     
                      SELECT k || '.' || (json_each(v)).key AS k, (json_each(v)).value AS v
                      FROM q
                      WHERE json_typeof(v) = 'object'
)

SELECT json_object_agg(k, v)
FROM q
WHERE json_typeof(v) != 'object';
 

Выход:

 { 
  "quote.daysRemaining" : "365", 
  "estimate.coveredEquipment.kickerMotorInsurance" : "No", 
  "estimate.coveredEquipment.vesselEngineType" : "None/Other", 
  "estimate.coveredEquipment.trailerInsurance" : "No", 
  "estimate.coveredEquipment.dinghyInsurance" : "No" 
}