SELECT foo FROM bar
WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
LIMIT 1;
我在另一个答案中看到了这个作为ORDER BY random()的替代方法。我需要确保id
总是大于零。我是否必须将>=
更改为>
?
答案 0 :(得分:1)
由于当x % y
是x
的倍数时y
返回0,答案为“是,您的表达式可能会返回0”。
因此,如果id
必须大于0,则需要使用>
而不是>=
。当然,如果模运算符没有返回0,你仍然可以使用>
而不是>=
,你会得到相同的效果。
答案 1 :(得分:1)
是。如果abs(random())
返回max(id)
的值,那么模数的结果将为零。由于abs(random())
可以返回介于0和0之间的任何值。 9223372036854775807,这绝对是可能的。
答案 2 :(得分:1)
是的它可以通过两种方式返回0
考虑3 % 3 == 0
,6 % 3 == 0
等。如果random()
恰好是max(id)
或偶数分隔符,则会得到0。
random()
也可以返回0和0 % anything == 0
,这是另一种可能性。
答案 3 :(得分:1)
是的,它应该是>因为模数除法可以返回0(a mod a ==0
,0 mod a == 0
)。此外,您可能想要检查(SELECT max(id)
是否为空/ 0(在某些系统中a mod 0
未定义,或者a)