SQLite Random() 在 ORDER BY 中没有正确排序

Posted

技术标签:

【中文标题】SQLite Random() 在 ORDER BY 中没有正确排序【英文标题】:SQLite Random() In ORDER BY not sorting correctly 【发布时间】:2014-03-25 06:50:42 【问题描述】:

我的 SQLite 查询似乎从规定的“ORDER BY”子句返回结果。当我运行以下命令时,第三列给了我想要的随机值,但 ORDER BY 看起来被忽略了。结果集似乎是随机排序的。

// frequency is an int of either 5, 10, or 15
String query = "SELECT id, name, ABS( RANDOM() % frequency ) FROM person ORDER BY 3"

SQLiteDatabase database = this.getReadableDatabase();
Cursor cursor = database.rawQuery(query, null);

返回类似:

id    name    (random)
------------------------------
16    Joe     1
 4    Jack    0
67    Jane    7
23    Bob     3

我尝试了许多变体,包括以下变体,但结果都相似:行未在第三列排序:

"SELECT id, name, (RANDOM() % frequency) AS myRand FROM person ORDER BY myRand"
id    name    myRand
------------------------------
23    Bob     2
16    Joe     1
67    Jane    -4
 4    Jack    0

"SELECT id, name, CAST(ABS( RANDOM() % frequency ) AS TEXT) AS myRand FROM person ORDER BY myRand"

id    name    myRand
------------------------------
23    Bob     "1"
16    Joe     "2"
67    Jane    "1"
 4    Jack    "5"

无奈之下,我什至尝试了这个......

"SELECT id, name, 'A' || CAST(ABS( RANDOM() % frequency ) AS TEXT) AS myRand FROM person ORDER BY myRand"
id    name    myRand
------------------------------
 4    Jack    "A9"
23    Bob     "A3"
67    Jane    "A8"
16    Joe     "A2"

第三列的实际结果值当然每次运行都不同,但第三列缺少排序是一致的。 为什么结果不按第三列排序?

【问题讨论】:

这是一个有同样问题的 SQL Fiddle:sqlfiddle.com/#!5/66ba7/2 【参考方案1】:

为什么结果不按第三列排序?

因为该列是一个表达式,它为ORDER BY 目的而重新评估,产生不同的随机值。

抱歉,目前想不出一种实用的方法来保留每行的随机顺序值。考虑更改您的要求 - ORDER BY RANDOM() 在大型数据集上表现不佳。

【讨论】:

以上是关于SQLite Random() 在 ORDER BY 中没有正确排序的主要内容,如果未能解决你的问题,请参考以下文章

iphone NSPredicate 中的 Random() 子句排序

如何在 SQLite 表中插入日期和查询日期

播种 SQLite RANDOM()

SQLite out of order error备忘

group_concat sqlite 和 order by

在 SQLite 的 GROUP_CONCAT 函数中使用 ORDER BY 子句