在SQLite中select随机行

在MySQL中,您可以使用以下语句selectX个随机行:

SELECT * FROM table ORDER BY RAND() LIMIT X 

但是,这并不适用于SQLite。 有没有相同的东西?

为了更好的性能使用:

 SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x) 

SQL引擎首先将行的投影字段加载到内存中,然后对它们进行sorting ,这里我们只是对内存中每行的id字段进行随机sorting,因为它是索引的,然后将它们分开,然后使用这些X ids来查找整行。

所以这消耗更less的内存和CPU随着表增长!

SELECT * FROM table ORDER BY RANDOM() LIMIT X

 SELECT * FROM table ORDER BY RANDOM() LIMIT 1 

这里的所有答案都基于ORDER BY 。 对于大型设备来说这是非常低效的(即不可用的)。 为什么不在WHERE子句中放置abs(CAST(random() AS REAL))/9223372036854775808 < 0.5以获得0.5次命中的机会呢?

 SELECT * FROM table WHERE abs(CAST(random() AS REAL))/9223372036854775808 < 0.5 

大数是random()可以产生的最大绝对数。 abs()是因为它是有符号的。 结果是一个0到1之间的均匀分布的随机variables。

 SELECT * FROM table ORDER BY RAND() LIMIT 1 

版本9.3.0(64位)