Все ответы здесь основаны на ORDER BY
.Это очень неэффективно (т.е. непригодно для использования) для больших наборов, потому что вы будете оценивать RANDOM()
для каждой записи, а затем ORDER BY
, что является дорогостоящей операцией.
Другой подход - поместить abs(CAST(random() AS REAL))/9223372036854775808 < 0.5
в предложение WHERE
, чтобы получить в этом случае, например, шанс попадания 0,5.
SELECT *
FROM table
WHERE abs(CAST(random() AS REAL))/9223372036854775808 < 0.5
Большое число - максимальное абсолютное числоrandom()
можно производить.abs()
потому что он подписан.Результатом является равномерно распределенная случайная величина между 0 и 1.
Это имеет свои недостатки.Вы не можете гарантировать результат, и если пороговое значение велико по сравнению с таблицей, выбранные данные будут смещены к началу таблицы.Но в некоторых тщательно продуманных ситуациях это может быть осуществимым вариантом.