如何使用特定键在json数组中搜索某些项?

时间:2019-05-02 16:34:38

标签: mysql sql json

表:some_table,记录:

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用于JSON。

select * from some_table where json_contains(data, '5', '$.a') = 1;

2 个答案:

答案 0 :(得分:0)

您当前的SQL语句有两个基本缺陷:

  1. 要检查键是否在JSON文档中,您需要使用json_contains_path()而不是json_contains(),这将允许您指定特定的键路径,而无需实际提供值您要为其寻找所述钥匙的人。
  2. 您正在利用path查找键a时并不认为该键将包含在数组结构中-您需要修改path才能在各处查找在文档中输入密钥a。 (H / T到MySQL :: MySQL 8.0 Reference Manual :: 11.6 The JSON Data Type

有了这些知识,您的查询现在看起来像这样:

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}] |
+----+--------------------------------------+

DB Fiddle

答案 1 :(得分:0)

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