Lorsque je cherche si, par exemple, "720" se situe entre la min_hour et la max_hour de chaque partie de la journée (begin et end), j'obtiens des résultats :
SELECT *
FROM `service_provider`
WHERE ((JSON_EXTRACT(`opening_hours`, '$."3"."begin"."min_hour"') <= '720' AND '720' <= JSON_EXTRACT(`opening_hours`, '$."3"."begin"."max_hour"')) OR (JSON_EXTRACT(`opening_hours`, '$."3"."end"."min_hour"') <= '720' AND '720' <= JSON_EXTRACT(`opening_hours`, '$."3"."end"."max_hour"')));
====> J'AI DES RÉSULTATS !
Mais quand je fais la même chose avec "1200", aucun résultat n'est trouvé :
SELECT *
FROM `service_provider`
WHERE ((JSON_EXTRACT(`opening_hours`, '$."3"."begin"."min_hour"') <= '1200' AND '1200' <= JSON_EXTRACT(`opening_hours`, '$."3"."begin"."max_hour"')) OR (JSON_EXTRACT(`opening_hours`, '$."3"."end"."min_hour"') <= '1200' AND '1200' <= JSON_EXTRACT(`opening_hours`, '$."3"."end"."max_hour"')));
-----> AUCUN RÉSULTAT.
Pourtant, il se situe bien entre "840" et "1290".
J'ai remarqué que seul les nombres avant ou égal à "720" donnait des résultats, donc il ne prend pas en compte la deuxième partie de ma requête (après le OR). Pourquoi ? Je vous remercie.
Une théorie (il faudrait que je teste) : parce que ce sont des chaînes, c'est un ordre lexicographique qui est appliqué, ce qui donne un tout autre résultat ?
Si ce sont des entiers, je ne comprends même pas pourquoi dans le JSON ils sont quotés d'ailleurs.
Oui en effet les valeurs étaient traitées comme des chaînes. J'ai résolu le problème.
comparer des valeurs avec JSON_EXTRACT
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli