首页 > 解决方案 > MySQL 解析和拆分 JSON 值

问题描述

我有一列包含不同长度的 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 中循环和拆分它们,这对我来说对客户端来说是相当沉重的。我想在一个查询中解析和拆分它们。

标签: mysqlarraysjsonknex.jsunnest

解决方案


如果您正在运行 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 上的演示

样本数据:

编号 | js                                                      
-: | :------------------------------------------------ ------
 1 | [“樱桃:2.50”,“平局:3.25”,“斯旺西杰克:2.87”]

Query results:

id | new_js                                                                                                                 
-: | :----------------------------------------------------------------------------------------------------------------------
 1 | [{"name": "The Cherries", "odds": "2.50"}, {"name": "Draw", "odds": "3.25"}, {"name": "Swansea Jacks", "odds": "2.87"}]

推荐阅读