我试图找出在 JSON 数组中是否有一行包含特定日期
假设我的数据如下所示:
id | application_id | data
Run Code Online (Sandbox Code Playgroud)
id | application_id | data
Run Code Online (Sandbox Code Playgroud)
如何找到数据包含日期的所有应用程序'2016-04-26'?
所以基本上我可以这样做:
select id, json_extract(`data`, "$[*].date") from applications
Run Code Online (Sandbox Code Playgroud)
返回:
# Rows
1 | 1 | [{"data" : ["some", "data#1"], "date": "2016-04-21"}, {"data" : ["other", "data#1"], "date" : "2016-04-22"}]
2 | 2 | [{"data" : ["some", "data#2"], "date": "2016-04-21"}, {"data" : ["other", "data#2"], "date" : "2016-04-26"}]
3 | 1 | [{"data" : ["some", "data#3"], "date": "2016-04-22"}, {"data" : ["other", "data#3"], "date" : "2016-04-26"}]
4 | 3 | [{"data" : ["some", "data#4"], "date": "2016-04-26"}]
Run Code Online (Sandbox Code Playgroud)
但是如果尝试json_extract在WHERE子句中使用,我只能在我在json_extract's path 参数中明确告诉数组的键时使用它,如下所示:
select * from applications where json_extract(`data`, "$[0].date") = "2016-04-26"
Run Code Online (Sandbox Code Playgroud)
正确返回 ID 为 4 的行。
但是,如果我尝试在路径中使用通配符,则它不再有效:
select * from applications where json_extract(`data`, "$[*].date") = "2016-04-26"
Run Code Online (Sandbox Code Playgroud)
这应该返回第 2、3、4 行。
我尝试了许多其他选项/变体,但似乎找不到正确构建查询的方法。
对于 MySQL JSON 的当前实现,这样的事情甚至可能吗?
Kle*_*men 21
Morgan Tucker - @morgo 提供的一种解决方案是这样使用json_contains:
select * from applications where json_contains(`data`, '{"date" : "2016-04-26"}')
Run Code Online (Sandbox Code Playgroud)
现在答案是可以的,但我相信它可能有一些性能问题,并且对我来说感觉有点 hackish(请参阅下一个查询)-但是当我到达那里时我会处理这些问题:)
如果我需要查询一个日期范围(从2016-04-24到2016-04-26),我需要为json_contains时间跨度中的每一天添加一个个人,如下所示:
select * from applications where json_contains(`data`, '{"date" : "2016-04-26"}') or json_contains(`data`, '{"date" : "2016-04-25"}') or json_contains(`data`, '{"date" : "2016-04-24"}')
Run Code Online (Sandbox Code Playgroud)
如果我将date密钥嵌套在其他地方,这将返回无效数据
所以如果你有不同的解决方案,我想知道
| 归档时间: |
|
| 查看次数: |
62211 次 |
| 最近记录: |