查看 MySQL 中的 JSON 数组是否包含其键包含特定日期的对象

Kle*_*men 23 mysql json

我试图找出在 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_extractWHERE子句中使用,我只能在我在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-242016-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密钥嵌套在其他地方,这将返回无效数据

所以如果你有不同的解决方案,我想知道