Postgresql
從集合中設置隨機值
我需要將一些隨機值放入數據庫,但我不想最終得到完全隨機的文本(如 7hfg43d3)。相反,我想隨機選擇我自己提供的值之一。
好主意。我建議做兩個小的簡化:
('{Foo,Bar,Poo}'::text[])[ceil(random()*3)]
- 使用數組字面量(
'{Foo,Bar,Poo}'::text[]
) 的更簡單語法 為更長的列表縮短字元串。額外的好處:顯式類型聲明適用於任何類型,而不僅僅是text
. 您最初的想法恰好是 outputtext
,因為這是字元串文字的預設類型。- 使用
ceil()
而不是floor() + 1
. 結果相同。好的,從理論上講,正如您的評論中所暗示的那樣,下限可以精確地為 0 ,因為
random()
產生(在此處引用手冊):0.0 <= x < 1.0 範圍內的隨機值
但是,我從未見過這種情況發生。執行幾百萬次測試:
SELECT count(*) FROM generate_series(1,1000000) WHERE ceil(random())::int = 0;
不過,為了絕對安全,您可以使用 Postgres 自定義數組下標,並且仍然避免額外添加:
('[0:2]={Foo,Bar,Poo}'::text[])[floor(random()*3)]
看:
('[0:2]={Foo,Bar,Poo}'::text[])[trunc(random()*3)]