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 值的主要内容,如果未能解决你的问题,请参考以下文章