【SQL実践|実務向け】SQLiteで「使える」乱数を生成する:random関数の活用術

1. 導入:なぜSQLiteでの乱数生成が必要か

データベース開発やテストにおいて、「ダミーデータの作成」や「ランダムなサンプル行の抽出」は避けて通れない作業です。特に開発環境で本番に近いボリュームのテストデータを作成する際、機械的に連番を入れるだけでは不十分なケースが多々あります。SQLiteのrandom関数を適切に使いこなすことで、クエリ一つで柔軟なテストデータ生成やデータサンプリングが可能になります。

2. 基礎知識:random関数とは

SQLiteのrandom関数は、-9223372036854775808 から 9223372036854775807 までの範囲で64ビットの符号付き整数を生成する関数です。
ポイントは「戻り値が非常に広い範囲である」ことです。そのままでは使いにくいため、以下の関数を組み合わせて加工するのが実務の定石です。
・abs関数:負の値を正の値に変換します。
・%(剰余)演算子:数値を指定した数で割った余りを取得し、範囲を限定します。

3. 実装/解決策:特定の範囲に収める方法

現場でよくある「0からN-1までの乱数が欲しい」というケースでは、「abs(random()) % N」というパターンが鉄板です。また、1からNまでの範囲にしたい場合は、「abs(random()) % N + 1」とすることで調整可能です。

4. サンプルプログラム

以下のSQLは、テストデータ生成時やデータ抽出時によく使われるパターンです。そのままコピーしてSQLiteクライアントで実行してみてください。

— 1. 0から9までの乱数を生成
SELECT abs(random()) % 10 AS random_0_to_9;

— 2. 1から10までの乱数を生成(ID割り振りなどで多用)
SELECT (abs(random()) % 10) + 1 AS random_1_to_10;

— 3. 既存テーブルからランダムに5行抽出するテクニック
— ORDER BYにrandom()を指定することで、結果セットをシャッフルしてから取得します
SELECT FROM users ORDER BY random() LIMIT 5;

— 4. 範囲指定(例:50から100まで)の乱数生成
— (abs(random()) % (最大値 – 最小値 + 1)) + 最小値 という計算式になります
SELECT (abs(random()) % 51) + 50 AS random_50_to_100;

5. 応用・注意点:現場で陥りやすい罠

注意点1:偏りの可能性
random関数による剰余演算(%)は、母数が非常に大きいため、実用上は十分にランダムに見えます。しかし、厳密な統計的分布が必要なシミュレーションなどには適さない場合があります。あくまで「ダミーデータの生成」や「簡易的なランダム抽出」として割り切って使用してください。

注意点2:パフォーマンスへの影響
「ORDER BY random()」は非常に便利ですが、テーブルの行数が多い場合、すべての行に対して乱数を生成・ソートするためパフォーマンスが極端に低下します。数万行を超える大規模なテーブルで「ランダムに1行取得したい」場合は、IDの最大値を取得した上で「WHERE id = (abs(random()) % max_id)」のように、インデックスを利用した抽出方法を検討してください。

コメント

タイトルとURLをコピーしました