Postgres查询返回意外结果

时间:2015-01-23 09:39:03

标签: postgresql

从表foo获取随机行。

create table foo as 
select generate_series(1,1000000) as val;

' VAL'是串行字段(不是主要字段)。 Field dosn没有休息。

此查询可能返回0,1,2,3,4 ...行,并且在所有行中val具有不同的值。为什么呢?

select * from foo where val = 
    (floor(random() * (select max(val) from foo))+1)::int;

略微将查询更改为

select * from foo where val = 
    (select (floor(random() * (select max(val) from foo))+1)::int as v);

按预期结果,表中的单个随机行

1 个答案:

答案 0 :(得分:2)

PostgreSQL的随机函数是volatile,这意味着它可以在每次评估时返回不同的值,第一个查询将不同的随机数与表中的每一行进行比较,第二个查询计算单个随机值并比较每个与此相关。

假设你想要一张洗牌的卡片:

select * from deck_of_cards order by random();

或者也许更多你的东西:

select floor(random()*6)+1::int from generate_series (1,6);