SQLite RANDOM()何时生成值?

问题描述 投票:1回答:1

我正在尝试使用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每次需要变量时都会随机生成rand_int的数据(这是我认为我看到的行为)?

sql sqlite
1个回答
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;

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

© www.soinside.com 2019 - 2024. All rights reserved.