mysql删除json数组的指定对象,查看MySQL中的JSON数组是否包含其键包含特定日期的对象...

我试图找出是否有一行包含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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值