Re: select where id=random()*something returns two results - Mailing list pgsql-bugs

From Rod Taylor
Subject Re: select where id=random()*something returns two results
Date
Msg-id 1063934713.40733.23.camel@jester
Whole thread Raw
In response to select where id=random()*something returns two results  (Ulrich Meis <u.meis@gmx.de>)
Responses Re: select where id=random()*something returns two results  (Ulrich Meis <u.meis@gmx.de>)
List pgsql-bugs
> select * from quotes where id=3D1+round(random()* cast ((select max(id)
> from quotes) as double precision));
>  id  |                           quote                           |
> author=20=20=20=20=20=20
> -----+-----------------------------------------------------------+------
> -----------
>  187 | Vergib Deinen Feinden, aber vergiss niemals ihre Namen.   | John
> F. Kennedy
>  377 | Die Wirklichkeit ist nicht so oder so, sondern so und so. | Harry
> Mulisch
> (2 rows)
>=20
> I'm not really into databases, but this sounds wrong. Most of the time,
> I actually get 0 results.

Random is calculated per call (in this case per comparison). So, the
value you compare against for 187 is not the same as 377.

UPDATE table SET column =3D random(); will show the effect.

If you wrap randon() in a subselect, it will cause it to be evaluated
once:

SELECT * from quotes where id =3D 1+round((SELECT random()) * cast(....).



However, a much faster query for your purposes would be:

SELECT * FROM quotes ORDER BY random() LIMIT 1;

pgsql-bugs by date:

Previous
From: Kris Jurka
Date:
Subject: Re: select where id=random()*something returns two results
Next
From: Ulrich Meis
Date:
Subject: Re: select where id=random()*something returns two results