在PostgreSQL中的循环内生成随机

时间:2019-03-14 05:17:12

标签: postgresql random lateral-join

我想执行几次(比如说30次)涉及随机数的“实验”

我的方法是:

select  
  rnd  
from 
  generate_series(0,30) as l,   -- number of times
lateral (
  select random() as rnd -- the "experiment"
) as t ;

您可以将其解读为“ 执行30次实验”。

问题在于该代码会生成30个精确数字。

注意:“实验”部分显然更为复杂,但是在其中的某个位置,它会为每个实验运行创建数百个随机数。即我想生成30百个随机数。这很重要,因为我知道我可以执行

select random() from generate_series(0,30)

并获得30个不同的随机数,但这不是我打算做的。

1 个答案:

答案 0 :(得分:3)

您的问题是LATERAL查询不依赖于左表表达式,因此PostgreSQL仅对其求值一次。

要对左表表达式中的每一行进行一次评估,请引入依赖项:

SELECT rnd
FROM generate_series(0,30) as l   -- number of times
CROSS JOIN LATERAL (
   SELECT l.l * 0 + random() AS rnd -- the "experiment"
) AS t;