我正在尝试使用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
的数据(这是我认为我看到的行为)?
每次调用random()
时,SQLite都会生成一个随机数。
但是,查询优化器将重新排列查询中的术语,因此您编写的内容不一定与实际执行的内容相同。
你可以exploit some SQLite internals to disable subquery flattening:
select r, r from (select random() as r from example limit -1) limit -1;
或者,更明显的是,在对它们进行计算之前将随机数存储在临时表中。