Mysql 如何在json数组中搜索具有特定键的某些项?
表:一些表,记录:Mysql 如何在json数组中搜索具有特定键的某些项?,mysql,sql,json,Mysql,Sql,Json,表:一些表,记录: id|data (json array of json object) 1|[{"a": 1, "b": 2}, {"a": 3, "b": 4}] 2|[{"a": 5, "b": 6}, {"a": 3, "b": 4}] 请给我看一下SQL MySQL,以查找其数据包含键为a、值为5的项的任何记录。只会找到记录2。我尝试了下面的SQL,但失败了,因为我不太熟悉使用SQL for JSON select * from some_table where json_cont
id|data (json array of json object)
1|[{"a": 1, "b": 2}, {"a": 3, "b": 4}]
2|[{"a": 5, "b": 6}, {"a": 3, "b": 4}]
请给我看一下SQL MySQL,以查找其数据包含键为a、值为5的项的任何记录。只会找到记录2。我尝试了下面的SQL,但失败了,因为我不太熟悉使用SQL for JSON
select * from some_table where json_contains(data, '5', '$.a') = 1;
当前SQL语句有两个基本缺陷: 为了检查JSON文档中是否存在密钥,您需要使用JSON_contains,而不是JSON_contains,这将允许您指定特定的密钥路径,而不必实际提供要查找的密钥的值。 您用来查找密钥a的路径并不考虑该密钥将包含在数组结构中——您需要修改路径,以便在文档中查找密钥a。电汇至 有了这些知识,您的查询现在将如下所示:
select * from some_table where json_contains_path(data, 'one', '$**.a')
其中,利用示例数据集返回:
+----+--------------------------------------+
| id | data |
+----+--------------------------------------+
| 1 | [{"a": 1, "b": 2}, {"a": 3, "b": 4}] |
| 2 | [{"a": 5, "b": 6}, {"a": 3, "b": 4}] |
+----+--------------------------------------+
谢谢你的帮助。我刚刚尝试了上面的SQL,但我得到了一个错误:错误3143 42000:无效的JSON路径表达式。错误在字符位置2附近。你知道吗?我错了,MySQL 8.0中的JSONPath实现似乎不支持双点。。选择器。请参阅上面我的答案**中更新的路径选择器。这次它起作用了,我得到了上面的结果。现在我得到了任何一条记录,它的数据包含一个键为a的项,接下来我应该做什么来过滤它们,只得到那些值w.r.t。键a是5?我试着从某个表中选择*,其中json包含数据'5','$**.a'=1;并得到错误3149 42000:在这种情况下,路径表达式可能不包含*和**标记或数组范围..谢谢!我使用了json_extract和json_contains,我成功了。从json包含数据->$**.a、'5'的某个表中选择*@画家布朗:很高兴听到!非常感谢你,我刚刚想出了和你一样的解决办法
select id, data
from
(
select 1 as id, '[{"a": 1, "b": 2}, {"a": 3, "b": 4}]' as data
union select 2 as id, '[{"a": 5, "b": 6}, {"a": 3, "b": 4}]' as data
) as tmp
where json_contains(data -> '$[*].a','5')