Postgresql

從集合中設置隨機值

  • October 26, 2021

我需要將一些隨機值放入數據庫,但我不想最終得到完全隨機的文本(如 7hfg43d3)。相反,我想隨機選擇我自己提供的值之一。

好主意。我建議做兩個小的簡化:

('{Foo,Bar,Poo}'::text[])[ceil(random()*3)]
  • 使用數組字面量( '{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;

-> SQL小提琴

不過,為了絕對安全,您可以使用 Postgres 自定義數組下標,並且仍然避免額外添加:

('[0:2]={Foo,Bar,Poo}'::text[])[floor(random()*3)]

看:

更好的是,使用trunc()這有點快。

('[0:2]={Foo,Bar,Poo}'::text[])[trunc(random()*3)]

引用自:https://dba.stackexchange.com/questions/55363