【问题标题】:postgres function that returns random enum返回随机枚举的postgres函数
【发布时间】:2019-07-16 16:12:10
【问题描述】:

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

我已停止使用此变体

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(

【问题讨论】:

    标签: postgresql plpgsql


    【解决方案1】:

    顺便使用一个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.

    【讨论】:

    • 我已经删除了函数的冗余元素,并在 dbfiddle 中添加了注释。
    【解决方案2】:

    不带 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');
    

    【讨论】:

    猜你喜欢
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    相关资源
    最近更新 更多