#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"
}