可以abs(random())%someNumberGreaterThanZero返回零吗?

时间:2011-03-08 05:43:13

标签: sql sqlite

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

我在另一个答案中看到了这个作为ORDER BY random()的替代方法。我需要确保id总是大于零。我是否必须将>=更改为>

4 个答案:

答案 0 :(得分:1)

由于当x % yx的倍数时y返回0,答案为“是,您的表达式可能会返回0”。

因此,如果id必须大于0,则需要使用>而不是>=。当然,如果模运算符没有返回0,你仍然可以使用>而不是>=,你会得到相同的效果。

答案 1 :(得分:1)

是。如果abs(random())返回max(id)的值,那么模数的结果将为零。由于abs(random())可以返回介于0和0之间的任何值。 9223372036854775807,这绝对是可能的。

答案 2 :(得分:1)

是的它可以通过两种方式返回0

考虑3 % 3 == 06 % 3 == 0等。如果random()恰好是max(id)或偶数分隔符,则会得到0。

random()也可以返回0和0 % anything == 0,这是另一种可能性。

答案 3 :(得分:1)

是的,它应该是>因为模数除法可以返回0(a mod a ==00 mod a == 0)。此外,您可能想要检查(SELECT max(id)是否为空/ 0(在某些系统中a mod 0未定义,或者a)