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)
但是因为
它不起作用
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;
没有 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');
我想写一个函数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)
但是因为
它不起作用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;
没有 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');