SQL查询float列0.0000到5.0000区间数据返回异常问题
问题根因
返回结果不符合预期的核心错误是给float数值类型的比较边界加了单引号,传入了字符串类型的比较值。
当比较运算符两侧数据类型不一致时,数据库会触发隐式类型转换:多数场景下数据库不会把字符串转成数值比较,反而会把float列的数值转成字符串,按字典序逐字符对比大小。
字典序对比和数值大小对比逻辑完全不同:比如数值30.91转成字符串是'30.9100',和'5.0000'对比时,第一个字符'3'的ASCII码小于'5',就会被判定为满足<= '5.0000'的条件,这就是30.91、148.47这类明显大于5的记录被错误返回的原因。
另外你原语句两个比较条件之间缺少AND逻辑连接符,在部分数据库中会直接抛出语法错误。
正确写法
去掉边界值的单引号,直接用数值和float列做比较,补全逻辑连接符即可:
SELECT * FROM table WHERE colmn >= 0.0000 AND colmn <= 5.0000;
如果要简化写法,也可以用区间查询语法BETWEEN,执行效果和上面的语句完全等价:
SELECT * FROM table WHERE colmn BETWEEN 0.0000 AND 5.0000;
额外说明
- 针对所有数值类型字段(float、int、decimal等)写查询条件时,传入的比较值不要加单引号,既可以避免隐式转换带来的结果错误,也能防止字段上的索引失效。
- 特殊场景下如果必须传入字符串格式的数值,要显式做类型转换后再比较,不要依赖数据库默认的隐式转换规则(不同数据库的隐式转换逻辑存在差异,很容易出现不可预期的错误),示例写法:
SELECT * FROM table WHERE colmn BETWEEN CAST('0.0000' AS DECIMAL(10,4)) AND CAST('5.0000' AS DECIMAL(10,4));
内容的提问来源于stack exchange,提问作者rakesh k.p
相关产品推荐
相关产品推荐

