暂无图片
mysql奇怪的rand行为
我来答
分享
怎么肥四
2024-11-27
mysql奇怪的rand行为

下面这个sql语句

with a as (
select rand()-0.5 val
from (values row(1),row(2),row(3),row(4),row(5),row(6),row(7),row(8),row(9),row(10)) a)
select
a.val,
if(a.val<0,0,a.val) val2
from a

的输出是这样

+-----------------------+-----------------------+
| val | val2 |
+-----------------------+-----------------------+
| 0.24151489393926684 | 0 |
| -0.3395825045551942 | -0.12570135539928579 |
| 0.45816259361632405 | -0.034902425049713304 |
| -0.17826328955428983 | 0 |
| -0.39825581004680677 | -0.4624905082979151 |
| 0.08190227074725764 | -0.2607922346897351 |
| 0.30509012919393375 | 0 |
| -0.37613345298556 | -0.3923464928682395 |
| -0.049284304072413854 | -0.19905711216764255 |
| 0.21286050296654968 | -0.33121206781939794 |
+-----------------------+-----------------------+

希望的结果是,当val小于0时,val2应该等于0,为什么有些行不是这样?

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
db

因为RAND()函数生成的随机数是浮点数,而浮点数在计算机中的表示并不是完全精确的。当RAND()-0.5的结果非常接近0但仍然是负数时,由于浮点数的精度问题,IF函数可能无法正确判断它是否小于0,从而导致val2没有被设置为0。

暂无图片 评论
暂无图片 有用 2
怎么肥四

那第一行又怎么解释呢

暂无图片 评论
暂无图片 有用 1
大大刺猬

其实这种问题问gpt答案来得最快

解决办法

加个SET SESSION optimizer_switch = 'derived_merge=OFF'; 就能达到你的要求了
image.png

分析

derived_merge 就是派生表是否合并的意思, 而对于random()这种不确定性的函数就有问题了, 执行计划都是有区别的.

为ON时,执行计划

image.png

为OFF时,执行计划

image.png

暂无图片 评论
暂无图片 有用 1
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏