я пытаюсь выяснить, есть ли строка, которая содержит конкретную дату в массиве 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"]
Но если попытаться использовать json_extract
в WHERE
предложении, я могу использовать его, только если я явно сообщу ключ массива в json_extract
аргументе пути, например, так:
select * from applications where json_extract(`data`, "$[0].date") = "2016-04-26"
который правильно возвращает строку с идентификатором 4.
Но если я попытаюсь использовать подстановочный знак в пути, он больше не работает:
select * from applications where json_extract(`data`, "$[*].date") = "2016-04-26"
это должно вернуть строки 2, 3, 4.
Я пробовал много других вариантов / вариантов, но я не могу найти способ правильно структурировать запрос.
Возможно ли что-то подобное в текущей реализации MySQL JSON?
data
, «$ [0] .date») в качестве «даты» из приложений, затем выберите id, json_extract (data
, «$ [1] .date») в качестве «даты» из приложений и т. д., к которым применяется весь фильтр и есть список идентификаторов