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%的時間。說實話,這與實際價值非常接近,但考慮到這個數據的大小,但它比我預期的要稍微偏離一點。但是,它足以解釋發生了什麼。