MySQL 解析和拆分 JSON 值

MySQL Parse and Split JSON value

我有一列包含 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
  },
]

我现在所做的是在 UI 中循环和拆分它们,这对我来说对客户来说非常繁重。我想在一个查询中解析和拆分它们。

如果你是运行 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

Demo on 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"}]

您可以使用 json_table 从 json 对象创建行。 只需将 table_name 替换为您的 table 名称并将 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;

这里有一个Dbfiddle你可以参考一下

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