Может abs (random ())% someNumberGreaterThanZero вернуть ноль? - PullRequest
0 голосов
/ 08 марта 2011
SELECT foo FROM bar
WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
LIMIT 1;

Я видел это в другом ответе как альтернативу ORDER BY random ().Мне нужно убедиться, что id всегда будет больше нуля.Должен ли я изменить >= на >?

Ответы [ 4 ]

1 голос
/ 08 марта 2011

Да, это должно быть>, потому что деление по модулю может вернуть 0 (a mod a ==0, 0 mod a == 0). Кроме того, вы можете проверить, является ли (SELECT max(id) не нулевым / 0 (a mod 0 не определено в некоторых системах или a)

1 голос
/ 08 марта 2011

Да. Если abs(random()) вернет значение max(id), то результат по модулю будет нулевым. Поскольку abs(random()) может возвращать любое значение в диапазоне от 0 до 9223372036854775807, это определенно возможно.

1 голос
/ 08 марта 2011

Да, он может вернуть 0 двумя способами

Считайте, что 3 % 3 == 0, 6 % 3 == 0 и т. Д. Тогда вы получите 0, если random() окажется max(id) или даже его делителем.

random() также может возвращать 0 и 0 % anything == 0, это другая возможность.

1 голос
/ 08 марта 2011

Поскольку x % y возвращает 0, когда x кратно y, ответ «Да, ваше выражение может вернуть 0».

Итак, если id должно быть больше 0, вам нужно использовать > вместо >=. Конечно, если оператор по модулю не вернул 0, вы все равно можете использовать > вместо >=, и вы получите тот же эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...