2017-04-11 102 views
1

我在postgresql中運行,我想從簡單的枚舉類型中選擇一個隨機值。我無法在網上找到一種方法。SQL從枚舉類型中挑選隨機值

這是一個類型的例子:

create type letter as enum('A','B','C','D'); 

現在我只想隨機選擇的一個字母。 謝謝!

回答

4

還有的要對此的一些方法。我會用enum_range轉儲枚舉值,然後unnest將它們分割成自己的行,然後就隨機抓一條記錄:

SELECT myletter FROM (SELECT unnest(enum_range(NULL::letter)) as myletter) sub ORDER BY random() LIMIT 1; 

我會想象你很可能這樣做在一個單一的選擇,而不使用一些不同的功能進行嵌套,但是對於下一個必須解密您所做的事情的人來說,這在邏輯上非常明確。


從在這裏評論@pozs,顯然子選擇是多餘的,因爲Postgres的支持直接在FROM子句中堅持的unnest()

SELECT myletter FROM unnest(enum_range(NULL::letter)) myletter ORDER BY random() LIMIT 1; 
+2

儘管子選擇是不必要的,但是FROM FROM(unnest(...)myletter)在PostgreSQL中是完全有效的。 – pozs

+0

哦,非常好。我只涉獵postgres,我總是很喜歡它的乾淨的語法,這是很好的小捷徑。 – JNevill

+0

哦,太棒了,這也返回爲'字母'型。按計劃運行非常感謝! – LaprimoSiesta

2

我想加盟pg_type裏和pg_enum它:

select e.* 
from pg_type t 
join pg_enum e on e.enumtypid = t.oid where typname='letter' 
order by random() 
limit 1; 

如:

t=# select enumlabel from pg_type t join pg_enum e on e.enumtypid = t.oid where typname='letter' order by random() limit 1; 
enumlabel 
----------- 
A 
(1 row) 

t=# select enumlabel from pg_type t join pg_enum e on e.enumtypid = t.oid where typname='letter' order by random() limit 1; 
enumlabel 
----------- 
D 
(1 row) 

t=# select enumlabel from pg_type t join pg_enum e on e.enumtypid = t.oid where typname='letter' order by random() limit 1; 
enumlabel 
----------- 
B 
(1 row) 
+0

非常感謝就像一個魅力。特別是'select e.enumlabel'只返回letter_。我將不得不找出這段代碼的工作原理,看起來有點不熟悉。 – LaprimoSiesta