Estou tentando descobrir se existe uma linha que contém uma data específica dentro de uma matriz JSON
Digamos que meus dados sejam assim:
Aplicações de mesa:
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"}]
Como posso encontrar todos os aplicativos cujos dados contêm a data '2016-04-26'
?
Então, basicamente, eu posso fazer isso:
select id, json_extract(`data`, "$[*].date") from applications
Que retorna:
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"]
Mas se tentar usar json_extract
a WHERE
cláusula, só posso usá-la se eu disser explicitamente a chave da matriz no json_extract
argumento do caminho, da seguinte maneira:
select * from applications where json_extract(`data`, "$[0].date") = "2016-04-26"
que retorna corretamente a linha com o ID 4.
Mas se eu tentar usar um curinga no caminho, ele não funcionará mais:
select * from applications where json_extract(`data`, "$[*].date") = "2016-04-26"
isso deve retornar as linhas 2, 3, 4.
Tentei muitas outras opções / variações, mas não consigo encontrar uma maneira de estruturar a consulta corretamente.
Algo assim é possível com a implementação atual do MySQL JSON?
data
, "$ [0] .date") como 'data' dos aplicativos, que não selecione o ID, json_extract (data
, "$ [1] .date") como 'data' dos aplicativos e etc. que aplique todos os filtros e têm lista de ID