returns 随机枚举的 postgres 函数

postgres function that returns random enum

我想写一个函数random_enum(enum_name) returns 随机枚举值

我已停止使用此变体

create type  myenum
as enum (
   'one',
   'two',
   'three',
   'four'
);


create or replace function random_enum(relation_name anyelement) returns anyenum as $$
begin
  return execute format(
    $sql$
      select unnest(enum_range(NULL::%1$I)) ORDER BY random() LIMIT 1;
    $sql$,
    pg_typeof(relation_name)
  );
end;
$$ language plpgsql;

select random_enum(null::myenum)

you can try it here

但是因为

它不起作用
ERROR:  syntax error at or near "("
LINE 12:   return execute format(

在方法中使用一个out参数:

create or replace function random_enum(relation_name anyelement, out result anyenum) 
as $$
begin
  execute format(
    $sql$
      select elem 
      from unnest(enum_range(null::%1$I)) as elem
      order by random() 
      limit 1;
    $sql$,
    pg_typeof(relation_name)
  ) into result;
end;
$$ language plpgsql;

db<>fiddle.

没有 OUT 参数的替代方案,定义为 SQL 函数。

create or replace function random_enum(
                  relation_name_in  text
                ) 
          returns text 
         language sql strict
as $$
    select e.enumlabel::text
      from pg_type t 
      join pg_enum e on t.oid = e.enumtypid  
      join pg_catalog.pg_namespace n on n.oid = t.typnamespace
     where t.typname = lower(relation_name_in)
     order by random()
     limit 1;
$$ ;

-- test 
select soq.random_enum('myenum');