1. ホーム
  2. sql

SQLite - ORDER BY RAND()

2023-09-24 10:12:52

質問

MySQLではRAND()関数が使えますが、SQLite 3では何か代替手段がありますか?

どのように解決するのですか?

を使って ランダム() :

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


EDIT (by QOP)です。 のドキュメントにあるように SQLite オートインクリメント edカラムのドキュメントにはこう書かれています。

上で説明した通常のROWID選択アルゴリズム は 単調増加するユニークなROWIDを生成します。 を生成します。 ROWIDの最大値を使用せず、テーブル内の最大の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 のエイリアスです。