PostgreSQLにはランダムな数値を取り出すRANDOM関数があり、これを使うことにより、テーブルからランダムにデータを取り出すことができる。


RANDOM関数は以下のように0以上1未満の値をランダムで返す。

> SELECT RANDOM();
      random
-------------------
 0.322386509888985
(1 row)

> SELECT RANDOM();
      random
-------------------
 0.677151894977853
(1 row)

これを使ってランダムにデータを取り出す。

例えば、以下のデータがあるとする。

> SELECT * FROM book;
 id |        title
----+----------------------
  1 | 赤ずきん
  2 | ブレーメンの音楽隊
  3 | 白雪姫
  4 | シンデレラ
  5 | ヘンゼルとグレーテル
  6 | いばら姫
  7 | 靴履き猫
  8 | 眠り姫
(8 rows)

ここからランダムに3件のデータを取り出すときは以下のようにする。

> SELECT * FROM book ORDER BY RANDOM() LIMIT 3;
 id |        title
----+----------------------
  5 | ヘンゼルとグレーテル
  6 | いばら姫
  3 | 白雪姫
(3 rows)

> SELECT * FROM book ORDER BY RANDOM() LIMIT 3;
 id |  title
----+----------
  7 | 靴履き猫
  8 | 眠り姫
  1 | 赤ずきん
(3 rows)

たったこれだけでランダムに取り出すことができる。

これは何をやっているかというと、「ORDER BY RANDOM()」でランダムに並び変えて、「LIMIT 3」で上位3件を取り出しているだけだ。 「ORDER BY RANDOM()」でランダムにソートできるというのがよくわからないという人は以下のようにしていると思えばわかりやすい。

> SELECT *, RANDOM() as r FROM book ORDER BY r;
 id |        title         |         r
----+----------------------+-------------------
  4 | シンデレラ           | 0.292744620839481
  2 | ブレーメンの音楽隊   | 0.294310421819943
  6 | いばら姫             | 0.339931524982644
  7 | 靴履き猫             | 0.526063969603769
  5 | ヘンゼルとグレーテル | 0.536989243951155
  8 | 眠り姫               | 0.645875060300285
  3 | 白雪姫               | 0.704935242284525
  1 | 赤ずきん             | 0.905760376204625
(8 rows)

これを使えば、ある条件に当てはまるデータの中から○○件ランダムで取り出すということもできる。