如何在列表中按随机顺序选择元素
字符串列表包含固定值
'I','Q','C','K','X','T','S','NE'
在查询创建时已知。该列表应以随机顺序返回。尝试过
select unnest( ARRAY['I','Q','C','K','X','T','S','NE'] )
order by random()
但这在每次运行时返回的行都保持相同的顺序。如何修改,以便每次运行时列表或行都呈现随机顺序?
使用PostgreSQL 17
更新
尝试使用以下方法更新行
create temp table test ( test text );
insert into test values (null);
insert into test values (null);
update test set
test=
(SELECT string_agg(val,',' order by random())
FROM (
SELECT unnest(ARRAY['I','Q','C','K','X','T','S','NE']) AS val
) t
ORDER BY random())
returning test
但两行的值相同。如何获得不同的值?
解决方案
在PostgreSQL 16+,使用 array_shuffle():db<>fiddle演示
select unnest(array_shuffle(array['I','Q','C','K','X','T','S','NE']));
| unnest |
|---|
| S |
| I |
| NE |
| C |
| T |
| K |
| Q |
| X |
它避免了你在测试中遇到的常量折叠:
update test
set test=array_to_string(array_shuffle(ARRAY['I','Q','C','K','X','T','S','NE']),',')
returning test;
| test |
|---|
| T,Q,I,NE,C,X,S,K |
| C,S,NE,K,I,T,X,Q |
与 random() 不同,它不依赖你可以通过 setseed() 控制的会话范围种子,因此不存在通过调整共享种子而意外影响其随机性的风险。
要获得你原始方法中通过添加 limit 条款得到的元素子集,可以使用 array_sample() 或者一个 切片:
select array_sample(array['I','Q','C','K','X','T','S','NE'],4);
select (array_shuffle(array['I','Q','C','K','X','T','S','NE']))[:4];
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。