当我尝试将值与JSON_EXTRACT进行比较时,我遇到了一个奇怪的问题。
这是我在数据库中的opening_hours列的摘录:
{"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"}}}
例如,当我搜索“ 720”是否在一天的每个部分(开始和结束)的min_hour和max_hour之间时,我得到了结果:
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"')));
====>有一些结果!
但是,当我对“ 1200”执行相同的操作时,未找到结果:
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"')));
----->没有结果。
但是它很好地介于“ 840”和“ 1290”之间。
我注意到只有“ 720”之前或等于“ 720”的数字才给出结果,因此它没有考虑查询的第二部分(“或”之后)。为什么呢 谢谢。
我首先想到的是,这些JSON_EXTRACT
最终值是以整数还是字符串形式返回的?从我的测试来看,它正在返回字符串。因此,当您在字符串上使用“ <=”进行比较时,它的行为不会像数字那样。让我们看看您的第一个查询:
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"')));
此返回结果是因为您正在使用OR
和的第一个条件
(JSON_EXTRACT(`opening_hours`, '$."3"."begin"."min_hour"') <= '720'
AND '720' <= JSON_EXTRACT(`opening_hours`, '$."3"."begin"."max_hour"')
是true
因为{"max_hour": "720", "min_hour": "420"}
两者都等于或小于720
。好吧,更像是“ 7”大于“ 4”或类似于“ 7”。如果您删除第一个条件,OR
如:
SELECT *
FROM `service_provider`
WHERE (JSON_EXTRACT(`opening_hours`, '$."3"."end"."min_hour"') <= '720'
AND '720' <= JSON_EXTRACT(`opening_hours`, '$."3"."end"."max_hour"'));
这不会返回任何内容,因为在第一个比较中,"end"."min_hour"
返回的结果840
是“ 8”大于“ 7”,并且第二个条件"end"."max_hour"
值1290
被识别为较小,因为“ 1”小于“ 7”。
我想你明白了。由于这是比较字符串,因此它始终是该值中第一个被比较的字符。
解决当前问题的一种快速方法是将JSON_EXTRACT
值转换为整数。我的建议:
SELECT *
FROM `service_provider`
WHERE ((JSON_EXTRACT(`opening_hours`, '$."3"."begin"."min_hour"')+0 <= 1200
AND 1200 <= JSON_EXTRACT(`opening_hours`, '$."3"."begin"."max_hour"')+0)
OR (JSON_EXTRACT(`opening_hours`, '$."3"."end"."min_hour"')+0 <= 1200
AND 1200 <= JSON_EXTRACT(`opening_hours`, '$."3"."end"."max_hour"')+0));
+0
在JSON_EXTRACT
值的末尾添加将很快将字符串转换为整数,您最好将其'
从中删除'1200'
。
如果您想查看从JSON
extract中返回的值并使用它,则可以将它们全部移入SELECT
并用于HAVING
进行比较,例如:
SELECT JSON_EXTRACT(`opening_hours`, '$."3"."begin"."min_hour"')+0 bmin,
JSON_EXTRACT(`opening_hours`, '$."3"."begin"."max_hour"')+0 bmax,
JSON_EXTRACT(`opening_hours`, '$."3"."end"."min_hour"')+0 emin,
JSON_EXTRACT(`opening_hours`, '$."3"."end"."max_hour"')+0 emax
FROM `service_provider`
HAVING ((bmin <= 1200 and bmax <= 1200) or (emin <= 1200 and emax <= 1200))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句