我正在尝试使用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}的数据每次需要变量时(我认为这是我看到的行为)?
答案 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;
或者更明显的是,在对它们进行计算之前,将随机数存储在临时表中。