MySQL Разбор и разделение JSON значение - PullRequest
0 голосов
/ 01 августа 2020

У меня есть столбец, который содержит JSON значение разной длины

["The Cherries:2.50","Draw:3.25","Swansea Jacks:2.87"]

Я хочу разделить их и сохранить в JSON вот так:

[
  {
    name: "The Cherries",
    odds: 2.50
  },
  {
    name: "Draw",
    odds: 3.25
  },
  {
    name: "Swansea",
    odds: 2.87
  },
]

То, что я сделал прямо сейчас, - это зацикливание и разделение их в пользовательском интерфейсе, что для меня довольно сложно для клиента. Я хочу проанализировать и разделить их все в одном запросе.

Ответы [ 2 ]

3 голосов
/ 01 августа 2020

Если вы используете MySQL 8.0, вы можете использовать json_table(), чтобы разбить исходный массив на строки, а затем построить новые объекты и объединить их с помощью json_arrayagg().

Нам нужен столбец первичного ключа (или набор столбцов), чтобы мы могли правильно агрегировать сгенерированные строки, я предположил id:

select 
    t.id, 
    json_arrayagg(json_object(
        'name', substring(j.val, 1, locate(':', j.val) - 1), 
        'odds', substring(j.val, locate(':', j.val) + 1)
    )) new_js
from mytable t
cross join json_table(t.js, '$[*]' columns (val varchar(500) path '$')) as j
group by t.id

Демо на DB Fiddle

Пример данных:

id | js                                                      
-: | :-------------------------------------------------------
 1 | ["The Cherries:2.50", "Draw:3.25", "Swansea Jacks:2.87"]

Результаты запроса:

id | new_js                                                                                                                 
-: | :----------------------------------------------------------------------------------------------------------------------
 1 | [{"name": "The Cherries", "odds": "2.50"}, {"name": "Draw", "odds": "3.25"}, {"name": "Swansea Jacks", "odds": "2.87"}]
1 голос
/ 01 августа 2020

Вы можете использовать json_table для создания строк из объекта json. Просто замените table_name своим именем таблицы и json столбцом, содержащим json

 SELECT json_arrayagg(json_object('name',SUBSTRING_INDEX(person, ':', 1) ,'odds',SUBSTRING_INDEX(person, ':', -1) )) 
 FROM table_name,
 JSON_TABLE(json, '$[*]' COLUMNS (person VARCHAR(40) PATH '$') people;

Вот скрипт Db, к которому вы можете обратиться

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=801de9f067e89a48d45ef9a5bd2d094a

...