SQL 5.7 中有一种方法可以解决这个问题。我将逐步编写解决方案。目标是找到骑士的力量。
我将使用与上一篇文章相同的示例表:
create table mytable ( mycol json );
insert into mytable set mycol = '[{"Race": "Orc", "strength": 14}, {"Race": "Knight", "strength": 7}]';
首先,获取一个仅包含种族的数组。
select json_extract(mycol, '$[*].Race') from mytable;
+----------------------------------+
| json_extract(mycol, '$[*].Race') |
+----------------------------------+
| ["Orc", "Knight"] |
+----------------------------------+
然后,在这个数组中搜索 Knight(并取消引用)。
select json_unquote(json_search(json_extract(mycol, '$[*].Race'), 'one', 'Knight')) from mytable;
+------------------------------------------------------------------------------+
| json_unquote(json_search(json_extract(mycol, '$[*].Race'), 'one', 'Knight')) |
+------------------------------------------------------------------------------+
| $[1] |
+------------------------------------------------------------------------------+
找到索引后,从数组中获取此元素。
select json_extract(mycol, json_unquote(json_search(json_extract(mycol, '$[*].Race'), 'one', 'Knight'))) from mytable;
+---------------------------------------------------------------------------------------------------+
| json_extract(mycol, json_unquote(json_search(json_extract(mycol, '$[*].Race'), 'one', 'Knight'))) |
+---------------------------------------------------------------------------------------------------+
| {"Race": "Knight", "strength": 7} |
+---------------------------------------------------------------------------------------------------+
然后得到这个元素的强度。
select json_extract(json_extract(mycol, json_unquote(json_search(json_extract(mycol, '$[*].Race'), 'one', 'Knight'))), '$.strength') as strength from mytable;
+----------+
| strength |
+----------+
| 7 |
+----------+
您可以在其他字段上重复此操作以创建其他列。