Задать вопрос
@KirSupi

Как выбрать значение по наибольшему ключу из объекта json?

Есть колонка с JSON, там в объекте по датам разбиты числа. Надо выбрать число с наибольшей датой (наибольшим ключом).
Пример:
{"2022-01-01": 4, "2022-05-05": 10, "2022-09-09": 9}

Отсюда надо вытащить 9, т.к. 2022-09-09 - наибольший ключ
Может быть есть какие-то функции подобные col->>"$.[MAX(*)]"?
  • Вопрос задан
  • 59 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
Традиционный ответ: Не хранить в JSON данные, которые для этого не предназначены.
А хранить их нормально - в предназначенной для этого связанной таблице.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
# Schema (MySQL v8.0)
CREATE TABLE `test` (
  `id` INT,
  `json` JSON
);
INSERT INTO `test` VALUES
  (1, '{"2022-01-01": 4, "2022-05-05": 10, "2022-09-09": 9}'),
  (2, '{"2022-05-01": 4, "2022-01-05": 10, "2022-03-09": 9}');

# Query #1
WITH `cte` AS (
  SELECT `t`.`id`, MAX(`j`.`json_key`) AS `key`
    FROM `test` AS`t`
    JOIN JSON_TABLE(
      JSON_KEYS(`json`), '$[*]' COLUMNS(`json_key` JSON PATH '$')
    ) AS `j`
    GROUP BY `t`.`id`
)
SELECT `t`.`id`, `c`.`key`, 
       JSON_EXTRACT(`t`.`json`, CONCAT('$.', `c`.`key`)) AS `val`
  FROM `cte` AS `c`
  JOIN `test` AS `t` ON `t`.`id` = `c`.`id`

# Result
| id  | key          | val |
| --- | ------------ | --- |
| 1   | "2022-09-09" | 9   |
| 2   | "2022-05-01" | 4   |
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы