2017-04-11 4 views
1

私はpostgresqlで実行しています。単純な列挙型からランダムな値を選択したいと思います。私は道をオンラインで見つけることができませんでした。SQL列挙型からランダム値を選択

これは、タイプの例である:

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

は今、私はちょうどランダム文字のいずれかを選択します。感謝! ありがとう!

答えて

4

このついて行くのいくつかの方法があります。私はあなたがおそらくせずに、単一の選択でこれを行うことができます想像

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

:私は、ただランダムにレコードの1つをつかむ、自分の行にそれらを分割する列挙値をダンプするenum_rangeを使用し、unnestういくつかの異なる機能を使用して入れ子にしていますが、これは論理的には、あなたがしていたことを解読しなければならない次の人にとっては明らかです。ここのコメントで@pozsから


PostgresはFROM句で直接unnest()を貼り付けるサポートしているため、明らかに副選択は不必要である:多くは魔法のように動作

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

サブ選択は不要ですが、 'FROM unnest(...)myletter'はPostgreSQLで完全に有効です。 – pozs

+0

ああ、とてもいいです。私はポストグレーブでしか扱うことができません。私はいつもそれがきれいな構文であることを喜んでおり、このような短いショートカットです。 – 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

感謝。 _especially 'select e.enumlabel'は文字だけを返します。私はこのコードがどのように動作しているかを知る必要があります。 – LaprimoSiesta

関連する問題