SQL整数除法与浮点数除法区别及BMI计算结果异常原因
SQL整数除法导致BMI计算偏差问题解答
题目要求
从patients表中查询patient_id、weight、height、isObese四个字段,其中isObese以0或1的布尔值展示:
- 肥胖判定规则:体重(kg) / (身高(m))² ≥ 30
- 表中
weight、height字段均为无小数的int类型,身高原始存储单位为cm,计算前需要转换为m单位。
初始错误实现代码
SELECT patient_id, weight, height, CASE WHEN weight/POWER(height/100,2) >= 30 then '1' ELSE '0' END AS isObese FROM patients
核心原因:整数除法与浮点数除法的差异
问题本质是SQL不同数据类型的运算规则差异:
- 当运算符两边的操作数都是整数类型时,SQL默认执行整数除法,运算结果会直接截断小数部分,仅保留整数位,不会保留精确的小数值。
- 初始写法里的
height/100中,height是int类型,常量100也是整数类型,因此会触发整数除法:比如身高为168cm时,168/100的计算结果是1,而非实际需要的1.68,后续计算平方、BMI的结果会完全偏离真实值。 - 正确写法中的
height/100.0,常量100.0是浮点数类型,SQL在运算时会自动把整数类型的height隐式转换为浮点数再做除法,得到精确的小数值:比如168/100.0=1.68,后续的平方、BMI计算结果才符合公式要求。
计算示例对比
以身高170cm、体重80kg的记录为例:
- 错误写法计算链路:170/100=1(整数截断)→ POWER(1,2)=1 → BMI=80/1=80 → 错误判定为肥胖,实际BMI为80/(1.7²)≈27.68,并未达到肥胖标准。
- 正确写法计算链路:170/100.0=1.7(浮点精确计算)→ POWER(1.7,2)=2.89 → BMI≈27.68 → 判定结果正确。
额外优化提示
初始代码中THEN '1'和ELSE '0'返回的是字符串类型的0和1,如果需要返回数值类型的布尔标识,可以去掉单引号,直接写THEN 1 ELSE 0即可。
内容的提问来源于stack exchange,提问作者asia
相关产品推荐
相关产品推荐

