我在postgresql中運行,我想從簡單的枚舉類型中選擇一個隨機值。我無法在網上找到一種方法。SQL從枚舉類型中挑選隨機值
這是一個類型的例子:
create type letter as enum('A','B','C','D');
現在我只想隨機選擇的一個字母。 謝謝!
我在postgresql中運行,我想從簡單的枚舉類型中選擇一個隨機值。我無法在網上找到一種方法。SQL從枚舉類型中挑選隨機值
這是一個類型的例子:
create type letter as enum('A','B','C','D');
現在我只想隨機選擇的一個字母。 謝謝!
還有的要對此的一些方法。我會用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;
我想加盟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)
非常感謝就像一個魅力。特別是'select e.enumlabel'只返回letter_。我將不得不找出這段代碼的工作原理,看起來有點不熟悉。 – LaprimoSiesta
儘管子選擇是不必要的,但是FROM FROM(unnest(...)myletter)在PostgreSQL中是完全有效的。 – pozs
哦,非常好。我只涉獵postgres,我總是很喜歡它的乾淨的語法,這是很好的小捷徑。 – JNevill
哦,太棒了,這也返回爲'字母'型。按計劃運行非常感謝! – LaprimoSiesta