77

MySQL では RAND() 関数を使用できますが、SQLite 3 に代替手段はありますか?

4

4 に答える 4

161
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
于 2009-08-10T07:43:16.580 に答える
54

random() の使用:

SELECT foo FROM bar
  WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
  LIMIT 1;

編集(QOPによる):SQLite Autoincrement ed列のドキュメントには次のように記載されているため:

上記の通常の ROWID 選択アルゴリズムは、最大の ROWID 値を使用せず、最大の ROWID を持つテーブル内のエントリを削除しない限り、単調に増加する一意の ROWID を生成します。行を削除すると、以前に削除した行の ROWID が新しい行の作成時に再利用される可能性があります

INTEGER PRIMARY KEY AUTOINCREMENT上記は、列がない場合にのみ当てはまります (列でも問題なく動作しINTEGER PRIMARY KEYます)。とにかく、これはより移植性/信頼性が高いはずです:

SELECT foo FROM bar
  WHERE _ROWID_ >= (abs(random()) % (SELECT max(_ROWID_) FROM bar))
LIMIT 1;

ROWID_ROWID_およびOIDすべて SQLite 内部行 ID のエイリアスです。

于 2009-08-10T07:44:37.093 に答える
43

解決済み:

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
于 2009-08-10T07:42:03.883 に答える