Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在json数组中搜索具有特定键的某些项?_Mysql_Sql_Json - Fatal编程技术网

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')