MySQL使用IN包含多浮点数查询返回NULL问题求助
问题原因及解决办法
这事儿核心是浮点数精度误差在搞鬼:
- 要是
LifeExpectancy字段用的是FLOAT或DOUBLE这类近似数值类型,数据库根本存不住45.2、46.2这种十进制小数的精确值——实际存在库里的可能是45.199999999999996这类近似值。 - 单个查
IN (45.2)时,数据库会把你写的45.2转成对应的近似浮点数,刚好能和库里存的近似值对上;但同时放两个值IN (45.2,46.2)时,多值匹配的逻辑下,这种精确比对就卡壳了,找不到匹配结果。
解决办法
想绕开这个坑,试试这几种方式:
- 换字段类型:把
LifeExpectancy改成DECIMAL/NUMERIC这类精确数值类型,能准确存住十进制小数,以后就不会有这种匹配问题。 - 不用精确值匹配,改用范围查询:
SELECT * FROM world.country c WHERE (c.LifeExpectancy BETWEEN 45.19 AND 45.21) OR (c.LifeExpectancy BETWEEN 46.19 AND 46.21); - 加精度容忍的比较逻辑:判断字段值和目标值的差值小于一个极小的阈值,比如:
SELECT * FROM world.country c WHERE ABS(c.LifeExpectancy - 45.2) < 0.01 OR ABS(c.LifeExpectancy - 46.2) < 0.01;
内容的提问来源于stack exchange,提问作者Filipe
相关产品推荐
相关产品推荐

