如何解析mysql中的映射字段?

如何解析mysql中的映射字段?,mysql,parsing,Mysql,Parsing,我有一个基于地图的字段,如下所示,我想知道如何在mysql中解析它?例如,如何计算xxx1出现了多少次 [“1111:xxx1”、“2222:xxx2”、“3333:xxx3”]SQL不是解析文本的好语言。您应该考虑以关系的方式存储数据,然后可以使用传统的SQL查询,如: SELECT COUNT(*) FROM mytable WHERE column2 = 'xxx1'; 显示的数据看起来像一个有效的JSON数组,但数组中的每个字符串都进一步拆分为“key:value”格式。我想知道为什么

我有一个基于地图的字段,如下所示,我想知道如何在mysql中解析它?例如,如何计算xxx1出现了多少次


[“1111:xxx1”、“2222:xxx2”、“3333:xxx3”]

SQL不是解析文本的好语言。您应该考虑以关系的方式存储数据,然后可以使用传统的SQL查询,如:

SELECT COUNT(*) FROM mytable WHERE column2 = 'xxx1';
显示的数据看起来像一个有效的JSON数组,但数组中的每个字符串都进一步拆分为“key:value”格式。我想知道为什么您没有将其完全格式化为JSON对象而不是数组:
{“1111”:“xxx1”、“2222”:“xxx2”、“3333”:“xxx3”}

但是有了给定的数据,可以在MySQL 8.0中执行以下操作(此解决方案依赖于旧版本的MySQL不支持的数据)

这会将数组拆分为行。现在我们可以在“:”上拆分它:

select 
  substring_index(element, ':', 1) as col1,
  substring_index(element, ':', -1) as col2 
from json_table(@j, '$[*]' columns(element varchar(20) path '$')) as j;
+------+------+
| col1 | col2 |
+------+------+
| 1111 | xxx1 |
| 2222 | xxx2 |
| 3333 | xxx3 |
+------+------+
最后,将其用作派生表子查询,以便我们可以引用列别名,搜索所需的值,并计算出现次数

select count(*) from (
  select 
    substring_index(element, ':', 1) as col1, 
    substring_index(element, ':', -1) as col2 
  from json_table(@j, '$[*]' columns(element varchar(20) path '$')) as j
) as t
WHERE t.col2 = 'xxx1';
+----------+
| count(*) |
+----------+
|        1 |
+----------+

与我在开始时显示的查询相比,这带来了很多不便。这就是为什么将数据存储在普通的行和列中比将所有内容塞进类似JSON的半结构化文档要好。

什么是“解析它”?请向我们展示一个示例,说明您希望从这个解析中得到什么。我使用其他键将这个映射字段存储在一个表下,一个键有一个类似json的字段,因此我希望解析这个字段,而不是创建另一个字段。我理解,但当您可以在给定列中搜索整个值,而不是复杂的子字符串表达式时,最好使用SQL。您会发现,以这样的方式存储数据会使使用索引优化搜索变得不可能。例如,在Java或Python中,您是否会将所有数据存储在一个由“:”字符分隔的字符串变量中?不,您可以将它们存储在单独的变量中。您可能会选择适合存储在其中的数据的变量类型。我决定改为使用python解析它,这样更容易
select count(*) from (
  select 
    substring_index(element, ':', 1) as col1, 
    substring_index(element, ':', -1) as col2 
  from json_table(@j, '$[*]' columns(element varchar(20) path '$')) as j
) as t
WHERE t.col2 = 'xxx1';
+----------+
| count(*) |
+----------+
|        1 |
+----------+