j'essaie de savoir s'il y a une ligne qui contient une date spécifique à l'intérieur d'un tableau JSON
Disons que mes données ressemblent à ceci:
Applications de table:
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"}]
Comment trouver toutes les applications dont les données contiennent la date '2016-04-26'
?
Donc, fondamentalement, je peux le faire:
select id, json_extract(`data`, "$[*].date") from applications
Qui retourne:
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"]
Mais si j'essaie d'utiliser json_extract
dans la WHERE
clause, je ne peux l'utiliser que si je dis explicitement la clé du tableau dans l' json_extract
argument du chemin, comme ceci:
select * from applications where json_extract(`data`, "$[0].date") = "2016-04-26"
qui renvoie correctement la ligne avec l'ID 4.
Mais si j'essaie d'utiliser un caractère générique dans le chemin, cela ne fonctionne plus:
select * from applications where json_extract(`data`, "$[*].date") = "2016-04-26"
cela devrait renvoyer les lignes 2, 3, 4.
J'ai essayé de nombreuses autres options / variantes mais je n'arrive pas à trouver un moyen de structurer correctement la requête.
Est-ce que quelque chose comme ça est même possible avec l'implémentation actuelle de MySQL JSON?
data
, "$ [0] .date") en tant que 'date' des applications, que- sélectionnez id, json_extract (data
, "$ [1] .date") en tant que 'date' des applications, etc. qu'appliquer tout le filtre et avoir la liste des identifiants