Partage
  • Partager sur Facebook
  • Partager sur Twitter

comparer des valeurs avec JSON_EXTRACT

Sujet résolu
    20 janvier 2021 à 2:43:36

    J'ai un problème étrange quand j'essaie de comparer des valeurs avec JSON_EXTRACT.

    Voici un extrait de ma colonne opening_hours dans la base de données :

    {"1": {"end": {"max_hour": "1290", "min_hour": "840"}, "begin": {"max_hour": "720", "min_hour": "420"}}, "2": {"end": {"max_hour": "1290", "min_hour": "840"}, "begin": {"max_hour": "720", "min_hour": "420"}}, "3": {"end": {"max_hour": "1290", "min_hour": "840"}, "begin": {"max_hour": "720", "min_hour": "420"}}, "4": {"end": {"max_hour": "1290", "min_hour": "840"}, "begin": {"max_hour": "720", "min_hour": "420"}}, "5": {"end": {"max_hour": "1290", "min_hour": "840"}, "begin": {"max_hour": "720", "min_hour": "420"}}}

    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.



    • Partager sur Facebook
    • Partager sur Twitter
      20 janvier 2021 à 11:32:25

      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.

      -
      Edité par julp 20 janvier 2021 à 11:32:58

      • Partager sur Facebook
      • Partager sur Twitter
        20 janvier 2021 à 18:16:38

        Bonjour,

        Même analyse que Julp ... les valeurs semblent traitées comme des chaînes pas comme des nombres ...

        Rajoutes des 0 devant les heures à 3 chiffres :

        {
        	"1": {
        		"end": {"max_hour": "1290", "min_hour": "0840"},
        		"begin": {"max_hour": "0720", "min_hour": "0420"}
        	},
        	"2": {
        		"end": {"max_hour": "1290", "min_hour": "0840"},
        		"begin": {"max_hour": "0720", "min_hour": "0420"}
        	},
        	"3": {
        		"end": {"max_hour": "1290", "min_hour": "0840"},
        		"begin": {"max_hour": "0720", "min_hour": "0420"}
        	},
        	"4": {
        		"end": {"max_hour": "1290", "min_hour": "0840"},
        		"begin": {"max_hour": "0720", "min_hour": "0420"}
        	},
        	"5": {
        		"end": {"max_hour": "1290", "min_hour": "0840"},
        		"begin": {"max_hour": "0720", "min_hour": "0420"}
        	}
        }

        Sinon forcer une conversion (CAST) en NUMBER ... pas glop ... mais astuce avec x1 :

        SELECT *
        FROM `service_provider`
        WHERE
        	(
        		JSON_EXTRACT(`opening_hours`, '$."3"."begin"."min_hour"')*1 <= 1200
        		AND 1200 <= JSON_EXTRACT(`opening_hours`, '$."3"."begin"."max_hour"')*1
        	) OR (
        		JSON_EXTRACT(`opening_hours`, '$."3"."end"."min_hour"')*1 <= 1200
        		AND 1200 <= JSON_EXTRACT(`opening_hours`, '$."3"."end"."max_hour"')*1
        	)

        -
        Edité par Benzouye 20 janvier 2021 à 18:16:57

        • Partager sur Facebook
        • Partager sur Twitter
        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
          3 février 2021 à 15:38:53

          Bonjour,

          Oui en effet les valeurs étaient traitées comme des chaînes. J'ai résolu le problème.

          • Partager sur Facebook
          • Partager sur Twitter

          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.
          • Editeur
          • Markdown