表: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;
答案 0 :(得分:0)
您当前的SQL语句有两个基本缺陷:
json_contains_path()
而不是json_contains()
,这将允许您指定特定的键路径,而无需实际提供值您要为其寻找所述钥匙的人。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}] |
+----+--------------------------------------+
答案 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')