MySQL JSON с произвольными ключами к таблице

#mysql #mysql-json

Вопрос:

Существует карта, вложенная в большую полезную нагрузку json, например

 {
    "map": {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3"
    },
    // more stuff
}
 

Я хотел бы создать такую таблицу:

  ------#-------- 
| Key  | Value  |
 ------#-------- 
| key1 | value1 |
| key2 | value2 |
| key3 | value3 |
 ------#-------- 
 

Единственное, о чем я могу думать, это написать сохраненную функцию, которая зацикливается на JSON_KEYS для преобразования всех пар ключ-значение в

 [{"key":"key1", "value":"value1"}, {"key":"key2", "value":"value2"}, ...]
 

что делает задачу тривиальной с помощью JSON_TABLE.

Есть ли более быстрый и элегантный способ?

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

1. Я не понимаю, почему люди используют JSON в MySQL. Почти все становится сложнее.

2. @Бармар, потому что они хотят мгновенного удовлетворения. Им не нужно думать о том, какие атрибуты им нужны, прежде чем они начнут загружать большие объемы данных в базу данных.

Ответ №1:

Вот решение:

 select j.key, json_unquote(json_extract(m.data, concat('$.map.', j.key))) as value from mytable as m
cross join json_table(json_keys(m.data, '$.map'), '$[*]' columns (`key` varchar(10) path '

Вывод с вашими образцами данных:

  ------ -------- 
| key  | value  |
 ------ -------- 
| key1 | value1 |
| key2 | value2 |
| key3 | value3 |
 ------ -------- 
 

Если этот запрос кажется неэлегантным или сложным в обслуживании, вы, вероятно, правы. Вы не должны хранить данные в JSON, если вам нужны простые или элегантные запросы.

Ответ №2:

у вас все хорошо, и даже для корпоративного проекта вы делаете это таким образом

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

1. Я думаю, вы можете добавить это в качестве комментария.

2. Мне кажется, я не понимаю, что это значит.

)) as j
Вывод с вашими образцами данных:


Если этот запрос кажется неэлегантным или сложным в обслуживании, вы, вероятно, правы. Вы не должны хранить данные в JSON, если вам нужны простые или элегантные запросы.

Ответ №2:

у вас все хорошо, и даже для корпоративного проекта вы делаете это таким образом

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

1. Я думаю, вы можете добавить это в качестве комментария.

2. Мне кажется, я не понимаю, что это значит.