Если вы используете 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"}]