MySQL 解析和拆分 JSON 值

Posted

技术标签:

【中文标题】MySQL 解析和拆分 JSON 值【英文标题】:MySQL Parse and Split JSON value 【发布时间】:2020-08-01 09:57:37 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

样本数据:

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

查询结果:

编号 | new_js -: | :------------------------------------------------ -------------------------------------------------- ------------------ 1 | ["name": "The Cherries", "odds": "2.50", "name": "Draw", "odds": "3.25", "name": "Swansea Jacks", "odds" ": "2.87"]

【讨论】:

嗨!我只是想问更多关于这个问题的信息。知道我正在使用子查询来合并所有表。 (SELECT * FROM _bet365_soccer_premier) as t 但它返回错误 Incorrect arguments to JSON_TABLE。但是,如果我不使用子查询,并且只使用_bet365_soccer_premier as t。有效,我不知道为什么 @KarmaBlackshaw:如果我理解正确,您需要将mytable 替换为您的union 子查询,例如from (select ... from table1 union all select ... from table2 union all ...) as t cross join json_table(...) as j ... 是的,我相信这就是我正在做的。 SELECT logs2.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 (SELECT * FROM _bet365_soccer_premier UNION ALL SELECT * FROM _bet365_hose_victoria) AS logs2 CROSS JOIN json_table(logs2.odds,'$[*]' COLUMNS (val VARCHAR (500) path '$')) AS j GROUP BY logs2.id 啊nvm,谢谢!我不知道我在哪里出错了,但是以前相同的查询不起作用,也许我运行了错误的查询。 @GMD,我发现了问题。如果仅通过单个表,则它不起作用。 dbfiddle.uk/…【参考方案2】:

您可以使用 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 fiddle

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

【讨论】:

谢谢!但我想知道如何使用它。比如说,我的表名是 table_name,而 JSON 列是 odds? json 将是表中包含 json 值的列。 它似乎不起作用。 SELECT json_arrayagg(json_object('name',SUBSTRING_INDEX(person, ':', 1) ,'odds',SUBSTRING_INDEX(person, ':', -1) )) FROM _bet365_soccer_premier AS table_name, JSON_TABLE(table_name.odds, '$[*]' COLUMNS (person VARCHAR(40) PATH '$') people; 创建一个数据库小提琴:dbfiddle.uk/…

以上是关于MySQL 解析和拆分 JSON 值的主要内容,如果未能解决你的问题,请参考以下文章

mysql如何截取一个json字符串

javascript 拆分和 JSON.parse

使用java根据键值拆分JSON文件中的数据

使用javascript将json数据集值拆分为数据表

根据列的值快速拆分 MySQL 表

mysql中如何拆分查询?如图所示。