将值与JSON_EXTRACT比较

yinyang

当我尝试将值与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));

+0JSON_EXTRACT的末尾添加将很快将字符串转换为整数,您最好将其'从中删除'1200'

如果您想查看从JSONextract中返回的值并使用它,则可以将它们全部移入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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用json_extract()在SQL中查询嵌套的JSON数据值?

来自分类Dev

PHP中的mysql JSON_EXTRACT返回“数组”而不是索引元素的值

来自分类Dev

JSON_EXTRACT不适用于BigQuery中的布尔值[已解决]

来自分类Dev

JSON_EXTRACT不适用于BigQuery中的布尔值[已解决]

来自分类Dev

MySQL JSON_EXTRACT()查询返回null

来自分类Dev

MySQL JSON_EXTRACT路径表达式错误

来自分类Dev

Bigquery json_extract()函数中的转义字符

来自分类Dev

如何输入动态密钥到json_extract mysql?

来自分类Dev

在MariaDB触发器中使用JSON_EXTRACT

来自分类Dev

未使用表达式索引 (JSON_EXTRACT)

来自分类Dev

如何在MySQL中使用JSON_EXTRACT并获取不带引号的字符串?

来自分类Dev

避免在BigQuery的JSON_EXTRACT函数中使用指数表示法

来自分类Dev

将属性值与输入json数据中其他属性的值进行比较

来自分类Dev

将$ _POST的值与PHP中存储在json文件中的值进行比较时出错

来自分类Dev

将值的分布与特定值进行比较

来自分类Dev

ansible - json_query 将布尔值与外部变量进行比较

来自分类Dev

比较JSON值并获取新的JSON

来自分类Dev

将值比较为null的异常

来自分类Dev

Javascript:将变量与值数组进行比较

来自分类Dev

将十六进制值与awk比较

来自分类Dev

熊猫将列值与0进行比较

来自分类Dev

在将值与数组键进行比较时

来自分类Dev

Android将Button与Textview值进行比较

来自分类Dev

Javascript:将变量与值数组进行比较

来自分类Dev

将总和值与主表进行比较

来自分类Dev

将值与Drools中的参数进行比较

来自分类Dev

将字典中的每个值相互比较

来自分类Dev

将多个值与MySQL表进行比较

来自分类Dev

将数组值与对象进行比较

Related 相关文章

热门标签

归档