当前位置: 代码网 > it编程>编程语言>Javascript > 使用MySQL从JSON字符串提取数据的方法详解

使用MySQL从JSON字符串提取数据的方法详解

2024年10月22日 Javascript 我要评论
1. 背景知识json(javascript object notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。mysql 从版本 5.7 开始支持 json 数据

1. 背景知识

json(javascript object notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。mysql 从版本 5.7 开始支持 json 数据类型,使得在数据库中存储和操作 json 数据成为可能。

在许多应用中,json 字符串可能存储在表的某个字段中,我们需要提取和转换这些数据以便进行进一步分析或展示。

2. 示例数据

假设我们在 wf_lcdy 表中有一个字段 lct,其中存储了如下 json 字符串:

{"15775d64e52c4ba3a8eef4bafc5f40e5":"875 162","75b67fab657748a9ab4bba141bfa0d36":"375 98","428299fd90814b3eaf129e8246f82b2a":"155 126"}

我们希望将其转换为以下格式的数组:

[{"id":"15775d64e52c4ba3a8eef4bafc5f40e5","x":875,"y":162},{"id":"75b67fab657748a9ab4bba141bfa0d36","x":375,"y":98},{"id":"428299fd90814b3eaf129e8246f82b2a","x":155,"y":126}]

3. sql 查询分析

以下是实现这一转换的 sql 查询:

select
    concat('[', group_concat(
            concat(
                    '{"id":"',
                    substring_index(substring_index(kv, ':', 1), '"', -1),
                    '", "x":',
                    cast(substring_index(substring_index(kv, ':', -1), ' ', 1) as unsigned),
                    ', "y":',
                    cast(substring_index(substring_index(kv, ':', -1), ' ', -1) as unsigned),
                    '}'
            )
                ), ']') as result
from (
         select
             trim(both '"' from kv) as kv
         from (
                  select
                      substring_index(substring_index(replace(replace(replace(lct, '{', ''), '}', ''), '"', ''), ',', numbers.n), ',', -1) as kv
                  from wf_lcdy
                           join (
                      select 1 as n union all select 2 union all select 3 union all select 4 union all
                      select 5 union all select 6 union all select 7 union all select 8 union all
                      select 9 union all select 10
                  ) numbers
                  where char_length(lct) - char_length(replace(lct, ',', '')) >= numbers.n - 1 and id = '0c86346993d64d98ad17892974bf8963'
              ) as temp
     ) as kv_pairs;

3.1 查询结构解析

  1. 内层查询

    • 去除多余字符:首先,使用 replace 函数将 lct 字段中的 {} 和 " 去掉。这样可以简化后续处理。
    • 分割字符串:使用 substring_index 将每个键值对分割开。我们通过一个数字表(1到10)来实现。数字表的作用是帮助我们迭代处理每个键值对,因为我们无法预先知道 json 中键值对的数量。
select
    substring_index(substring_index(replace(replace(replace(lct, '{', ''), '}', ''), '"', ''), ',', numbers.n), ',', -1) as kv
  1. 这段代码将 json 字符串拆分为多个键值对,kv 列中将包含这样的值,例如:

    • 15775d64e52c4ba3a8eef4bafc5f40e5:875 162
    • 75b67fab657748a9ab4bba141bfa0d36:375 98
    • 428299fd90814b3eaf129e8246f82b2a:155 126
  2. 中层查询

    • 在此查询中,我们会对 kv 列进行进一步处理。使用 trim(both '"' from kv) 去掉多余的引号,以确保后续操作不会受到影响。
select
    trim(both '"' from kv) as kv
  • 外层查询
    • 聚合和格式化:在外层查询中,我们使用 group_concat 聚合所有的 kv 对,并使用 concat 生成目标格式的 json 字符串。
    • 提取数据:使用 substring_index 提取 idx 和 y 的值,并将它们转换为相应的格式。这里的关键在于分割字符串并提取数字。
group_concat(
    concat(
        '{"id":"',
        substring_index(substring_index(kv, ':', 1), '"', -1),
        '", "x":',
        cast(substring_index(substring_index(kv, ':', -1), ' ', 1) as unsigned),
        ', "y":',
        cast(substring_index(substring_index(kv, ':', -1), ' ', -1) as unsigned),
        '}'
    )
)
    • 最终结果:最终的结果将是一个字符串,格式为 json 数组。

4. 查询结果

运行上述查询后,您将得到所需的结果格式:

[{"id":"15775d64e52c4ba3a8eef4bafc5f40e5","x":875,"y":162},{"id":"75b67fab657748a9ab4bba141bfa0d36","x":375,"y":98},{"id":"428299fd90814b3eaf129e8246f82b2a","x":155,"y":126}]

5. 性能考虑

  • 字符长度计算char_length(lct) - char_length(replace(lct, ',', '')) 的计算用于确保我们只处理存在的键值对。此方法对性能有一定影响,特别是对于大文本。
  • 数字表的使用:由于 json 的结构可能变化,数字表的使用可以扩展以支持更多的键值对。在实际应用中,您可以根据需要增加数字的范围。

6. 总结

通过上述 sql 查询,我们成功地从一个包含 json 字符串的字段中提取了数据并转换成了另一种结构化格式。这种方法展示了 mysql 在处理 json 数据方面的灵活性和强大能力。

在实际应用中,您可以根据具体的需求对查询进行适当的修改,以适应不同结构的 json 数据。此外,了解 sql 中字符串处理和聚合函数的使用,对于提升数据处理的能力和效率至关重要。希望本篇文章对您在处理 json 数据时有所帮助!

以上就是使用mysql从json字符串提取数据的方法详解的详细内容,更多关于mysql json提取数据的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com