我试图找出是否有一行包含JSON数组中的特定日期
假设我的数据如下所示:
表格应用:
id | application_id | data
# 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"}]
如何查找数据包含日期“2016-04-26”的所有应用程序?
基本上我可以做到这一点:
select id, json_extract(`data`, "$[*].date") from applications
哪个回报:
1 | ["2016-04-21", "2016-04-22"]
2 | ["2016-04-21", "2016-04-26"]
3 | ["2016-04-22", "2016-04-26"]
4 | ["2016-04-26"]
但是如果尝试在WHERE子句中使用json_extract,我只能在json_extract的path参数中明确告诉数组的键时使用它,如下所示:
select * from applications where json_extract(`data`, "$[0].date") = "2016-04-26"
正确返回id为4的行.
但是,如果我尝试在路径中使用通配符,那么它将不再起作用:
select * from applications where json_extract(`data`, "$[*].date") = "2016-04-26"
这应该返回行2,3,4.
我尝试了很多其他选项/变体,但我似乎找不到正确构造查询的方法.
当前的MySQL JSON实现是否可以实现这样的功能?
解决方法:
Morgan Tucker提供的一个解决方案 – @morgo就像使用json_contains一样:
select * from applications where json_contains(`data`, '{"date" : "2016-04-26"}')
现在答案还可以,但我相信它可能会有一些性能问题,对我来说感觉有些讨厌(参见下一个查询) – 但是当我到达那里时我会处理那些问题:)
如果我需要查询日期范围(从2016-04-24到2016-04-26),我需要在时间跨度中为每一天添加一个invididual 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"}')
如果我将日期键嵌套在其他地方,这将返回无效数据
所以如果你有不同的解决方案,我想知道
标签:mysql,json
来源: https://codeday.me/bug/20190805/1589627.html