0
https://gist.github.com/anonymous/2463d5a8ee2849a6e1f5为什么在一个case语句内调用random()会产生意想不到的结果?
查询1不会产生预期结果。但是,查询2和3可以。为什么将调用移至case(case)语句之外的random()?
https://gist.github.com/anonymous/2463d5a8ee2849a6e1f5为什么在一个case语句内调用random()会产生意想不到的结果?
查询1不会产生预期结果。但是,查询2和3可以。为什么将调用移至case(case)语句之外的random()?
考虑第一个表达式:
select (case when round(random()*999999) + 1 between 000001 and 400000 then 1
when round(random()*999999) + 1 between 400001 and 999998 then 2
when round(random()*999999) + 1 between 999999 and 999999 then 3
else 4
end)
from generate_series(1, 8000000)
想必,你认为值“4”应该几乎从来没有被选中。但是,问题是random()
正在分别为每个when
子句调用。
所以,机会就失败每个子句独立:
这意味着约24%的时间(60%* 40%* 99.9999%),值“4”将出现。实际上,第一个查询返回“4”23.98%的时间。说实话,这与实际价值非常接近,但考虑到这个数据的大小,但它比我预期的要稍微偏离一点。但是,它足以解释发生了什么。