kor*_*rda 13 postgresql random
我需要将一些随机值放入数据库,但我不想最终得到完全随机的文本(如 7hfg43d3)。相反,我想随机选择自己提供的值之一。
Erw*_*ter 28
好主意。我建议两个小的简化:
('{Foo,Bar,Poo}'::text[])[ceil(random()*3)]
Run Code Online (Sandbox Code Playgroud)
使用数组字面量( '{Foo,Bar,Poo}'::text[]
) 的更简单语法缩短较长列表的字符串。额外的好处:显式类型声明适用于任何类型,而不仅仅是text
. 您最初的想法恰好是 output text
,因为这是字符串文字的默认类型。
使用ceil()
代替floor() + 1
。结果一样。
好的,理论上,下边界可以精确地为 0,正如您的评论中所暗示的那样,因为random()
产生(在此处引用手册):
0.0 <= x < 1.0 范围内的随机值
然而,我从未见过这种情况发生。运行几百万次测试:
SELECT count(*)
FROM generate_series(1,1000000)
WHERE ceil(random())::int = 0;
Run Code Online (Sandbox Code Playgroud)
但是,为了完全安全,您可以使用 Postgres 自定义数组下标,并且仍然避免额外添加:
('[0:2]={Foo,Bar,Poo}'::text[])[floor(random()*3)]
Run Code Online (Sandbox Code Playgroud)
('[0:2]={Foo,Bar,Poo}'::text[])[trunc(random()*3)]
Run Code Online (Sandbox Code Playgroud)
我想出了使用数组来实现这一点的想法:
(ARRAY['Foo','Bar','Poo'])[floor(random()*3)+1]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11564 次 |
最近记录: |