Postgresql 为什么在case语句中调用random()会产生意外的结果?

Postgresql 为什么在case语句中调用random()会产生意外的结果?,postgresql,random,case,Postgresql,Random,Case,查询1未生成预期结果。但是,查询2和查询3确实如此。为什么将对random()的调用移到case语句之外很重要?考虑第一个表达式: 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(rand


查询1未生成预期结果。但是,查询2和查询3确实如此。为什么将对random()的调用移到case语句之外很重要?

考虑第一个表达式:

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()

因此,每项条款失败的可能性是独立的:

  • 大约60%的情况下,随机数与“1”不匹配
  • 大约40%的时候,一个随机数与“2”不匹配
  • 大约99.9999%的时间,一个随机数与“3”不匹配(很抱歉,如果“9”的数字是关闭的,但该值实际上是1)
这意味着大约24%的时间(60%*40%*99.9999%)会出现值“4”。实际上,第一个查询有23.98%的时间返回“4”。老实说,这非常接近实际值,但是考虑到数据的大小,但它比我预期的要远一点。然而,这已经足够解释正在发生的事情了