postgresql - PostgreSQL:通过随机 ID 选择,结果很奇怪
问题描述
我想从具有bigint
PK 和值的表中选择随机行(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 测试。
解决方案
我认为如果你这样做,你的第二个查询应该总是返回一个值:
select * from xoid
where xoid.id = (select width_bucket(random(), 0, 1, 100));
推荐阅读
- javascript - Puppeteer:获取网页的完整 HTML 内容,如 innerHTML,但包括任何影子根?
- java - JBoss 异步记录器问题
- javascript - 如果单击复选框,如何获得不同的输出?
- python - 递归合并排序的功能实现?
- java - java.sql.SQLException:无法加载 JDBC 驱动程序类“oracle.jdbc.OracleDriver”
- swift - 类型“MatchedValue”不符合协议“可解码”
- androidx - 在全屏 androidx.BiometricPrompt 中禁用后退按钮
- .net - 带BufferBlock的Producer/Consumer,即使buffer中没有product,如何周期性唤醒?
- timer - 完成线程后,倒数计时器仍在工作..这是为什么?
- php - Laravel 7 在输入为空时显示“整数”验证消息,即使它不是必需的