SQLite RANDOM()何时生成值?

时间:2018-03-02 18:16:52

标签: sql sqlite

我正在尝试使用RANDOM()在SQLite中生成一组随机数,然后对随机变量执行一些操作。但是,我注意到随机数可能太随机了。

如果我生成随机数foo,然后执行foo + 1等操作,则foo的随机数在这两个步骤之间会有所不同。

举个例子:

create table example (row);
insert into example values ((1), (2), (3), (4), (5));
select rand_int, rand_int from (select random() as rand_int from example);

我希望两列的值与它们rand_int相同。但是,我得到以下内容:

rand_int            |rand_int
-5260381568243288466|-7496653829633048866
-8052390701785370463| 7419520968895340417
-4115751602452871973| 1327613517212963758
 -349032467862864821| 8300157345288949689
-7986362792467963959|-5529549013375197694

运行子查询时,SQLite是否存储rand_int的随机抽取值,然后在子查询之外修复(这是我预期的行为),或SQLite随机生成{{1}的数据每次需要变量时(我认为这是我看到的行为)?

1 个答案:

答案 0 :(得分:2)

每次调用random()时,SQLite都会生成一个随机数。

但是,查询优化器将重新排列查询中的术语,因此您编写的内容不一定与实际执行的内容相同。

你可以exploit some SQLite internals to disable subquery flattening

select r, r from (select random() as r from example limit -1) limit -1;

或者更明显的是,在对它们进行计算之前,将随机数存储在临时表中。