首页 > 解决方案 > PostgreSQL:通过随机 ID 选择,结果很奇怪

问题描述

我想从具有bigintPK 和值的表中选择随机行(text在下面的示例中,我尝试使用UUID但更改了示例以避免gen_random_uuid默认情况下在 PG 12 上不是这样):

create table xoid (id bigint primary key, oid TEXT);
insert into xoid (select generate_series(1, 100) as id, md5(random()::TEXT) as oid);

现在我尝试使用以下块中的第二个选择来选择随机行,其他选择在那里进行检查:

select * from width_bucket(random(), 0, 1, 100);

select * from xoid
    where xoid.id = width_bucket(random(), 0, 1, 100);

select * from
     (select width_bucket(random(), 0, 1, 100) id from generate_series(1,10)) a
    left join xoid on xoid.id = a.id;

奇怪的是,第一个选择总是返回一个随机数,第三个选择,我检查随机数是否与表连接总是按预期返回 10 行 - 并且都有 OID。

但是第二个键选择有时不返回任何行 - 更有趣的是,有时返回多行,2 或 4。有时它返回一个。该选择与表中的 ID 不匹配有什么问题?是什么东西width_bucket吗?但是为什么它总是在第二个选择中起作用?(那个是为了识别 的错误值而写的width_bucket,但显然我失败了。:-))

可用作小提琴:https ://www.db-fiddle.com/f/2mRXT4wGjM2ZSftjgKyZce/36

用 PG 12/13 测试。

标签: postgresqlselect

解决方案


我认为如果你这样做,你的第二个查询应该总是返回一个值:

select * from xoid
    where xoid.id = (select width_bucket(random(), 0, 1, 100));

推荐阅读