如何在列表中按随机顺序选择元素

后端开发 2026-07-11

字符串列表包含固定值

'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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章