SQL从枚举类型

时间:2017-04-11 13:19:36

标签: sql postgresql

我在postgresql中运行,我想从简单的枚举类型中选择一个随机值。我找不到网上的方式。

这是一个类型示例:

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

现在我只想随机选择其中一个字母。 谢谢!

2 个答案:

答案 0 :(得分:4)

有几种方法可以解决这个问题。我会使用enum_range转储枚举值,然后unnest将它们拆分成自己的行,然后随机抓取其中一条记录:

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

我想你可以在没有使用某些不同功能的嵌套的单个选择中做到这一点,但从逻辑上讲,这对于下一个必须破译你正在做的事情的人来说非常清楚。

在@pozs的评论中,显然这个子选择是多余的,因为Postgres支持将unnest()直接粘贴在FROM子句中:

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

答案 1 :(得分: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)