【问题标题】:MySQL Parse and Split JSON valueMySQL 解析和拆分 JSON 值
【发布时间】: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 中循环和拆分它们,这对我来说对客户端来说相当繁重。我想在一个查询中解析和拆分它们。

【问题讨论】:

    标签: mysql arrays json knex.js unnest


    【解决方案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/…
    猜你喜欢
    • 2023-03-10
    • 2020-01-30
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多