MySQL基于属性值返回JSON数组索引

MySQL基于属性值返回JSON数组索引,mysql,json,Mysql,Json,我有一个包含JSON数据的表,如下所示: {"a": [{"color": "blue", "value": 15}, {"color": "red", "value": 30}]} 我需要得到“值”,它位于同一个对象“blue”的内部 我想使用下面的代码: SELECT JSON_EXTRACT(my_data, '$.a[0].value'); 问题是“蓝色”对象可以位于数组的任何索引中 那么,有没有办法先检索索引,然后使用正确的索引进行查询 更新 Barmar的答案是有效的,但它需要用

我有一个包含JSON数据的表,如下所示:

{"a": [{"color": "blue", "value": 15}, {"color": "red", "value": 30}]}
我需要得到“值”,它位于同一个对象“blue”的内部

我想使用下面的代码:

SELECT JSON_EXTRACT(my_data, '$.a[0].value');
问题是“蓝色”对象可以位于数组的任何索引中

那么,有没有办法先检索索引,然后使用正确的索引进行查询

更新

Barmar的答案是有效的,但它需要用JSON_UNQUOTE()包装使用
JSON_SEARCH()
找到
blue
的路径

SELECT JSON_EXTRACT(my_data, REPLACE(JSON_SEARCH(my_data, 'one', 'blue'), '.color', '.value'))

JSON\u SEARCH
将返回类似
$.a[0].color的字符串
REPLACE
将其更改为
$.a[0].value
,然后提取该元素。

以下是使用以下内容的示例:

然后,您可以在
WHERE
子句中应用条件,就像将数据存储在普通表中一样

select j.* from d, json_table(d.data, '$.a[*]' columns (
  color varchar(20) path '$.color', 
  value int path '$.value')
) as j 
where j.color = 'blue';
+-------+-------+
| color | value |
+-------+-------+
| blue  |    15 |
+-------+-------+
这要求您在每次查询JSON数据时都编写一个类似这样的复杂查询

有人想知道,如果从一开始就将JSON存储在普通表中是否会更容易

我经常向MySQL用户建议,如果需要使用SQL表达式引用JSON中的各个字段,那么将数据存储为JSON会让您做更多的工作。在这些情况下,我不会使用JSON,而是将JSON数组分解成行,将JSON字段分解成一组普通表的列。然后,您可以编写更简单的查询,可以使用索引进行优化,并且可以正确使用约束和数据类型


JSON是最近MySQL版本中最容易被误用的功能。

感谢您的回复。你测试过了吗?因为我收到了“无效的JSON路径表达式。错误在字符位置1附近。”。但是我会尝试用你的解释来解决这个问题。不,我没有一个支持JSON的MySQL版本。看起来JSON路径必须是一个文本,你不能使用表达式来计算路径。这只是避免在MySQL中使用JSON的另一个原因。它使你的模式非规范化,而且函数非常繁琐和有限。你的答案很有用,而且用JSON_UNQUOTE()包装句子也很有效。我同意你对JSON数据类型有用性的评估。从理论上讲,这似乎是一个好主意,但在实践中,这似乎是一场噩梦(不是从个人经验来看,只是从试图回答问题等方面来说)。JSON的实现是为了满足市场需求。MongoDB有,PostgreSQL有。开发人员一直要求将非结构化数据注入数据库的“灵活性”,因为他们无法定义具体的模式。通常这也不是他们的错,因为他们正在制定一个产品规范,而该规范没有提供足够的具体细节来定义模式。是的,我理解为什么会出现这样的妥协。好吧,这比我几年前在Invision Power Board源代码中看到的要好——它们将一些选项存储在PHP
serialize()
格式中,并使用
LIKE
RLIKE
搜索匹配项。哎哟。这听起来像是一个经典的例子。你能发布完整的解决方案,包括标记和所有内容吗?
select j.* from d, json_table(d.data, '$.a[*]' columns (
  color varchar(20) path '$.color', 
  value int path '$.value')
) as j 
where j.color = 'blue';
+-------+-------+
| color | value |
+-------+-------+
| blue  |    15 |
+-------+-------+