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
示例数据:
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
我有一列包含 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
示例数据:
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